home *** CD-ROM | disk | FTP | other *** search
/ Spacewalker F97 / Spacewalker F97.iso / RECYCLED / DD28.FR_ / DD28.FR (.txt)
Encoding:
Visual Basic Form  |  1996-01-28  |  125.4 KB  |  3,391 lines

  1. VERSION 4.00
  2. Begin VB.Form frm3DMaze 
  3.    BackColor       =   &H00FFFFFF&
  4.    Caption         =   "3DMaze"
  5.    ClientHeight    =   4464
  6.    ClientLeft      =   1560
  7.    ClientTop       =   1980
  8.    ClientWidth     =   6000
  9.    Height          =   5136
  10.    Icon            =   "3dmaze.frx":0000
  11.    KeyPreview      =   -1  'True
  12.    Left            =   1512
  13.    LinkTopic       =   "Form1"
  14.    ScaleHeight     =   4464
  15.    ScaleWidth      =   6000
  16.    Top             =   1356
  17.    Width           =   6096
  18.    Begin VB.TextBox Text1 
  19.       BackColor       =   &H00FFFFFF&
  20.       BorderStyle     =   0  'None
  21.       Height          =   288
  22.       Left            =   0
  23.       Locked          =   -1  'True
  24.       TabIndex        =   1
  25.       Top             =   4200
  26.       Width           =   6012
  27.    End
  28.    Begin VB.VScrollBar VScroll1 
  29.       Height          =   4212
  30.       LargeChange     =   5
  31.       Left            =   5760
  32.       Max             =   60
  33.       Min             =   30
  34.       TabIndex        =   0
  35.       Top             =   0
  36.       Value           =   45
  37.       Width           =   252
  38.    End
  39.    Begin VB.Timer Timer1 
  40.       Enabled         =   0   'False
  41.       Interval        =   55
  42.       Left            =   0
  43.       Top             =   0
  44.    End
  45.    Begin VB.Menu mnuAction 
  46.       Caption         =   "&Action"
  47.       Begin VB.Menu mnuActionItem 
  48.          Caption         =   "&New"
  49.          Index           =   0
  50.       End
  51.       Begin VB.Menu mnuActionItem 
  52.          Caption         =   "&Solve"
  53.          Enabled         =   0   'False
  54.          Index           =   1
  55.       End
  56.       Begin VB.Menu mnuActionItem 
  57.          Caption         =   "&Clear"
  58.          Enabled         =   0   'False
  59.          Index           =   2
  60.       End
  61.       Begin VB.Menu mnuActionItem 
  62.          Caption         =   "-"
  63.          Index           =   3
  64.       End
  65.       Begin VB.Menu mnuActionItem 
  66.          Caption         =   "E&xit"
  67.          Index           =   4
  68.       End
  69.    End
  70.    Begin VB.Menu mnuOptions 
  71.       Caption         =   "&Options"
  72.       Begin VB.Menu mnuParameters 
  73.          Caption         =   "&Parameters..."
  74.          Index           =   0
  75.       End
  76.       Begin VB.Menu mnuStyle 
  77.          Caption         =   "&Style"
  78.          Index           =   1
  79.          Begin VB.Menu mnuStyleItem 
  80.             Caption         =   "&Hexagonal rooms"
  81.             Index           =   0
  82.          End
  83.          Begin VB.Menu mnuStyleItem 
  84.             Caption         =   "&Square rooms"
  85.             Index           =   1
  86.          End
  87.       End
  88.    End
  89.    Begin VB.Menu mnuHelp 
  90.       Caption         =   "&Help"
  91.       Begin VB.Menu mnuHelpItem 
  92.          Caption         =   "&About..."
  93.          Index           =   0
  94.       End
  95.    End
  96. Attribute VB_Name = "frm3DMaze"
  97. Attribute VB_Creatable = False
  98. Attribute VB_Exposed = False
  99. Option Explicit
  100. Private Type CornerRec
  101.   X As Long
  102.   Y As Long
  103. End Type
  104. Private Type VertexRec
  105.   X As Double
  106.   Y As Double
  107. End Type
  108. Private Type StackRec
  109.   Index1 As Byte
  110.   Index2 As Integer
  111. End Type
  112. Private Type PALETTEENTRY
  113.   peRed As Byte
  114.   peGreen As Byte
  115.   peBlue As Byte
  116.   peFlags As Byte
  117. End Type
  118. Private Type LOGPALETTE
  119.   palVersion As Integer
  120.   palNumEntries As Integer
  121.   palPalEntry(16) As PALETTEENTRY
  122. End Type
  123. Private Declare Function CreatePalette Lib "GDI32" (LogicalPalette As LOGPALETTE) As Long
  124. Private Declare Function CreatePen Lib "GDI32" (ByVal PenStyle As Long, ByVal Width As Long, ByVal Color As Long) As Long
  125. Private Declare Function CreatePolygonRgn Lib "GDI32" (lpPoints As Any, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
  126. Private Declare Function CreateSolidBrush Lib "GDI32" (ByVal rgbColor As Long) As Long
  127. Private Declare Function DeleteObject Lib "GDI32" (ByVal hndobj As Long) As Long
  128. Private Declare Function FillRgn Lib "GDI32" (ByVal hDC As Long, ByVal hRegion As Long, ByVal hBrush As Long) As Long
  129. Private Declare Function GetDeviceCaps Lib "GDI32" (ByVal hDC As Long, ByVal Index As Long) As Long
  130. Private Declare Function LineTo Lib "GDI32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long) As Long
  131. Private Declare Function MoveToEx Lib "GDI32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal NullPtr As Long) As Long
  132. Private Declare Function RealizePalette Lib "GDI32" (ByVal hDC As Long) As Long
  133. Private Declare Function SelectPalette Lib "GDI32" (ByVal hDC As Long, ByVal PaletteHandle As Long, ByVal Background As Long) As Long
  134. Private Declare Function SelectObject Lib "GDI32" (ByVal hDC As Long, ByVal ObjectHandle As Long) As Long
  135. Const PLANES = 14
  136. Const BITSPIXEL = 12
  137. Const PC_NOCOLLAPSE = 4
  138. Const COLORS = 24
  139. Const PS_SOLID = 0
  140. Const NumColors = 16
  141. Const TopColor = 12: ' all but last 3 colors are gray
  142. Const RectangleSENWColor = 10
  143. Const TriangleSSENNWColor = 9
  144. Const TriangleSENWColor = 8
  145. Const RectangleWEColor = 7
  146. Const FloorColor = 6
  147. Const TriangleSWNEColor = 5
  148. Const RectangleSWNEColor = 4
  149. Const TriangleSSWNNEColor = 3
  150. Const BackoutColor = 13
  151. Const AdvanceColor = 14
  152. Const SolutionColor = 15
  153. Const SecondsForMazeSelection = 0.25
  154. Public MinWallLengthInInches As Double
  155. Public RelativeHeightOfWall As Double
  156. Public RelativeWidthOfWall As Double
  157. Public Resize As Boolean
  158. Public Seed As String
  159. Public SolutionDisplayed As Boolean
  160. Public UserHasSolved As Boolean
  161. Dim AlreadyPainting As Boolean
  162. Dim BaseRectangle(5, 3) As VertexRec
  163. Dim BaseTriangle(3, 2) As VertexRec
  164. Dim ComputerPage() As Byte
  165. Dim CosTilt As Double
  166. Dim CurrentColor As Integer
  167. Dim HexDeltaX(5, 719) As Integer
  168. Dim HexDeltaY(5, 719) As Integer
  169. Dim MaxX As Integer
  170. Dim MaxY As Integer
  171. Dim Minimized As Boolean
  172. Dim NumColumns As Integer
  173. Dim NumRealized As Long
  174. Dim NumRoomsInMaze As Integer
  175. Dim NumRows As Integer
  176. Dim OldPaletteHandle As Long
  177. Dim Paint As Boolean
  178. Dim PaletteHandle As Long
  179. Dim PixelsPerX As Double
  180. Dim PixelsPerZ As Double
  181. Dim Rectangle(5, 3) As VertexRec
  182. Dim RedGreenBlue(16) As Long
  183. Dim RelDistOfUserFromScreen As Double
  184. Dim ScrollValue As Integer
  185. Dim SinTilt As Double
  186. Dim SqrDeltaX(3, 23) As Integer
  187. Dim SqrDeltaY(3, 23) As Integer
  188. Dim Sqrt3 As Double
  189. Dim Stack() As StackRec
  190. Dim State As Byte
  191. Dim Style As String
  192. Dim SubstitutionHigh(99) As Byte
  193. Dim SubstitutionLow(99) As Byte
  194. Dim Tilt As Double
  195. Dim UsePalette As Boolean
  196. Dim UserPage() As Byte
  197. Dim UserX As Integer
  198. Dim UserXRelative As Double
  199. Dim UserY As Integer
  200. Dim UserYRelative As Double
  201. Dim VisibleWindowState As Integer
  202. Dim X As Integer
  203. Dim XMax As Double
  204. Dim XOffset As Double
  205. Dim Y As Integer
  206. Dim YMax As Double
  207. Dim YMod4 As Byte
  208. Dim YOffset As Double
  209. Private Sub DrawQuadrilateral(Box() As CornerRec, ColorNum As Integer)
  210.   Dim Brush As Long
  211.   Dim rc As Long
  212.   Dim Region As Long
  213.   If UsePalette Then
  214.     Brush = CreateSolidBrush(16777216 + ColorNum)
  215.     If Brush Then
  216.       Region = CreatePolygonRgn(Box(0), 4, 1)
  217.       If Region Then
  218.         rc = FillRgn(frm3DMaze.hDC, Region, Brush)
  219.         rc = DeleteObject(Region)
  220.       End If
  221.       rc = DeleteObject(Brush)
  222.     End If
  223.   Else
  224.     Brush = CreateSolidBrush(RedGreenBlue(ColorNum))
  225.     If Brush Then
  226.       Region = CreatePolygonRgn(Box(0), 4, 1)
  227.       If Region Then
  228.         rc = FillRgn(frm3DMaze.hDC, Region, Brush)
  229.         rc = DeleteObject(Region)
  230.       End If
  231.       rc = DeleteObject(Brush)
  232.     End If
  233.   End If
  234. End Sub
  235. Private Sub GetCorner(X#, Y#, Z#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, Corner As CornerRec)
  236.   Dim XAdjusted As Double
  237.   Dim YPrime As Double
  238.   Dim ZAdjusted As Double
  239.   Dim ZPrime As Double
  240.   YPrime = (YMax# - Y#) * CosTilt# - Z# * SinTilt#
  241.   ZPrime = (YMax# - Y#) * SinTilt# + Z# * CosTilt#
  242.   ZAdjusted = (YMax# / 2#) + RelDistOfUserFromScreen# * (ZPrime - (YMax# / 2#)) / (YPrime + RelDistOfUserFromScreen#)
  243.   XAdjusted = (XMax# / 2#) + RelDistOfUserFromScreen# * (X# - (XMax# / 2#)) / (YPrime + RelDistOfUserFromScreen#)
  244.   XAdjusted = XAdjusted + XOffset#
  245.   Corner.X = Int(PixelsPerX# * XAdjusted)
  246.   Corner.Y = (ScaleHeight - Text1.Height) - Int(PixelsPerZ# * ZAdjusted)
  247. End Sub
  248. Private Sub DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0#, Y0#, Z0#, X1#, Y1#, Z1#, X2#, Y2#, Z2#, X3#, Y3#, Z3#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, Shade%)
  249.   Dim Quadrilateral(3) As CornerRec
  250.   Dim TemQuad As CornerRec
  251.   Call GetCorner(X0#, Y0#, Z0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
  252.   Quadrilateral(0).X = TemQuad.X
  253.   Quadrilateral(0).Y = TemQuad.Y
  254.   Call GetCorner(X1#, Y1#, Z1#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
  255.   Quadrilateral(1).X = TemQuad.X
  256.   Quadrilateral(1).Y = TemQuad.Y
  257.   Call GetCorner(X2#, Y2#, Z2#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
  258.   Quadrilateral(2).X = TemQuad.X
  259.   Quadrilateral(2).Y = TemQuad.Y
  260.   Call GetCorner(X3#, Y3#, Z3#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
  261.   Quadrilateral(3).X = TemQuad.X
  262.   Quadrilateral(3).Y = TemQuad.Y
  263.   Call DrawQuadrilateral(Quadrilateral(), Shade%)
  264. End Sub
  265. Private Sub DrawTriangle(Box() As CornerRec, ColorNum As Integer)
  266.   Dim Brush As Long
  267.   Dim rc As Long
  268.   Dim Region As Long
  269.   If UsePalette Then
  270.     Brush = CreateSolidBrush(16777216 + ColorNum)
  271.     If Brush Then
  272.       Region = CreatePolygonRgn(Box(0), 3, 1)
  273.       If Region Then
  274.         rc = FillRgn(frm3DMaze.hDC, Region, Brush)
  275.         rc = DeleteObject(Region)
  276.       End If
  277.       rc = DeleteObject(Brush)
  278.     End If
  279.   Else
  280.     Brush = CreateSolidBrush(RedGreenBlue(ColorNum))
  281.     If Brush Then
  282.       Region = CreatePolygonRgn(Box(0), 3, 1)
  283.       If Region Then
  284.         rc = FillRgn(frm3DMaze.hDC, Region, Brush)
  285.         rc = DeleteObject(Region)
  286.       End If
  287.       rc = DeleteObject(Brush)
  288.     End If
  289.   End If
  290. End Sub
  291. Private Sub DisplayTriangle(XMax#, XOffset#, YMax#, X0#, Y0#, Z0#, X1#, Y1#, Z1#, X2#, Y2#, Z2#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, Shade%)
  292.   Dim Triangle(2) As CornerRec
  293.   Dim TemTriangle As CornerRec
  294.   Call GetCorner(X0#, Y0#, Z0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemTriangle)
  295.   Triangle(0).X = TemTriangle.X
  296.   Triangle(0).Y = TemTriangle.Y
  297.   Call GetCorner(X1#, Y1#, Z1#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemTriangle)
  298.   Triangle(1).X = TemTriangle.X
  299.   Triangle(1).Y = TemTriangle.Y
  300.   Call GetCorner(X2#, Y2#, Z2#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemTriangle)
  301.   Triangle(2).X = TemTriangle.X
  302.   Triangle(2).Y = TemTriangle.Y
  303.   Call DrawTriangle(Triangle(), Shade%)
  304. End Sub
  305. Private Sub OutputTriangle(XMax#, XOffset#, YMax#, Triangle() As VertexRec, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, FirstPass%, FaceColor%)
  306.   Dim X0 As Double
  307.   Dim X1 As Double
  308.   Dim X2 As Double
  309.   Dim X3 As Double
  310.   Dim Y0 As Double
  311.   Dim Y1 As Double
  312.   Dim Y2 As Double
  313.   Dim Y3 As Double
  314.   If FirstPass% Then
  315.     If ((Triangle(1).X < XMax# / 2#) And (Triangle(1).X > Triangle(0).X)) Then
  316.       X0 = Triangle(2).X
  317.       Y0 = Triangle(2).Y
  318.       X1 = Triangle(1).X
  319.       Y1 = Triangle(1).Y
  320.       X2 = Triangle(1).X
  321.       Y2 = Triangle(1).Y
  322.       X3 = Triangle(2).X
  323.       Y3 = Triangle(2).Y
  324.       Call DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, TriangleSSWNNEColor)
  325.     End If
  326.     If ((Triangle(1).X > XMax# / 2#) And (Triangle(1).X < Triangle(2).X)) Then
  327.       X0 = Triangle(1).X
  328.       Y0 = Triangle(1).Y
  329.       X1 = Triangle(0).X
  330.       Y1 = Triangle(0).Y
  331.       X2 = Triangle(0).X
  332.       Y2 = Triangle(0).Y
  333.       X3 = Triangle(1).X
  334.       Y3 = Triangle(1).Y
  335.       Call DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, TriangleSSENNWColor)
  336.     End If
  337.   Else
  338.     X0 = Triangle(0).X
  339.     Y0 = Triangle(0).Y
  340.     X1 = Triangle(2).X
  341.     Y1 = Triangle(2).Y
  342.     X2 = Triangle(2).X
  343.     Y2 = Triangle(2).Y
  344.     X3 = Triangle(0).X
  345.     Y3 = Triangle(0).Y
  346.     Call DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, FaceColor%)
  347.     X0 = Triangle(0).X
  348.     Y0 = Triangle(0).Y
  349.     X1 = Triangle(1).X
  350.     Y1 = Triangle(1).Y
  351.     X2 = Triangle(2).X
  352.     Y2 = Triangle(2).Y
  353.     Call DisplayTriangle(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, RelativeHeightOfWall, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, TopColor)
  354.   End If
  355. End Sub
  356. Private Sub OutputRectangle(XMax As Double, XOffset As Double, YMax As Double, Rectangle() As VertexRec, PixelsPerX As Double, PixelsPerZ As Double, CosTilt As Double, SinTilt As Double, RelDistOfUserFromScreen As Double, FaceColor As Integer)
  357.   Dim X0 As Double
  358.   Dim X1 As Double
  359.   Dim X2 As Double
  360.   Dim X3 As Double
  361.   Dim Y0 As Double
  362.   Dim Y1 As Double
  363.   Dim Y2 As Double
  364.   Dim Y3 As Double
  365.   X0 = Rectangle(3).X
  366.   Y0 = Rectangle(3).Y
  367.   X1 = Rectangle(2).X
  368.   Y1 = Rectangle(2).Y
  369.   X2 = Rectangle(2).X
  370.   Y2 = Rectangle(2).Y
  371.   X3 = Rectangle(3).X
  372.   Y3 = Rectangle(3).Y
  373.   Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FaceColor)
  374.   X0 = Rectangle(0).X
  375.   Y0 = Rectangle(0).Y
  376.   X1 = Rectangle(1).X
  377.   Y1 = Rectangle(1).Y
  378.   X2 = Rectangle(2).X
  379.   Y2 = Rectangle(2).Y
  380.   X3 = Rectangle(3).X
  381.   Y3 = Rectangle(3).Y
  382.   Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, RelativeHeightOfWall, X3, Y3, RelativeHeightOfWall, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, TopColor)
  383. End Sub
  384. Private Sub OutputLeftRight(XMax As Double, XOffset As Double, YMax As Double, Rectangle() As VertexRec, PixelsPerX As Double, PixelsPerZ As Double, CosTilt As Double, SinTilt As Double, RelDistOfUserFromScreen As Double)
  385.   Dim X0 As Double
  386.   Dim X1 As Double
  387.   Dim X2 As Double
  388.   Dim X3 As Double
  389.   Dim Y0 As Double
  390.   Dim Y1 As Double
  391.   Dim Y2 As Double
  392.   Dim Y3 As Double
  393.   If 2# * Rectangle(0).X > XMax Then
  394.     X0 = Rectangle(0).X
  395.     Y0 = Rectangle(0).Y
  396.     X1 = Rectangle(3).X
  397.     Y1 = Rectangle(3).Y
  398.     X2 = Rectangle(3).X
  399.     Y2 = Rectangle(3).Y
  400.     X3 = Rectangle(0).X
  401.     Y3 = Rectangle(0).Y
  402.     Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSENWColor)
  403.   End If
  404.   If 2# * Rectangle(1).X < XMax Then
  405.     X0 = Rectangle(2).X
  406.     Y0 = Rectangle(2).Y
  407.     X1 = Rectangle(1).X
  408.     Y1 = Rectangle(1).Y
  409.     X2 = Rectangle(1).X
  410.     Y2 = Rectangle(1).Y
  411.     X3 = Rectangle(2).X
  412.     Y3 = Rectangle(2).Y
  413.     Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSWNEColor)
  414.   End If
  415. End Sub
  416. Private Sub DrawLine(X1 As Double, Y1 As Double, X2 As Double, Y2 As Double, XMax As Double, XOffset As Double, YMax As Double, CosTilt As Double, SinTilt As Double, PixelsPerX As Double, PixelsPerZ As Double, RelDistOfUserFromScreen As Double)
  417.   Dim LineX1 As Long
  418.   Dim LineX2 As Long
  419.   Dim LineY1 As Long
  420.   Dim LineY2 As Long
  421.   Dim Pen As Long
  422.   Dim PreviousPen As Long
  423.   Dim rc As Long
  424.   Dim tem As CornerRec
  425.   Call GetCorner(X1, Y1, RelativeHeightOfWall, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, XMax, XOffset, YMax, tem)
  426.   LineX1 = tem.X
  427.   LineY1 = tem.Y
  428.   Call GetCorner(X2, Y2, RelativeHeightOfWall, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, XMax, XOffset, YMax, tem)
  429.   LineX2 = tem.X
  430.   LineY2 = tem.Y
  431.   If UsePalette Then
  432.     Pen = CreatePen(PS_SOLID, 2, 16777216 + CurrentColor)
  433.     If Pen Then
  434.       PreviousPen = SelectObject(frm3DMaze.hDC, Pen)
  435.       rc = MoveToEx(frm3DMaze.hDC, LineX1, LineY1, 0)
  436.       rc = LineTo(frm3DMaze.hDC, LineX2, LineY2)
  437.       rc = SelectObject(frm3DMaze.hDC, PreviousPen)
  438.       rc = DeleteObject(Pen)
  439.     End If
  440.   Else
  441.     Pen = CreatePen(PS_SOLID, 2, RedGreenBlue(CurrentColor))
  442.     If Pen Then
  443.       PreviousPen = SelectObject(frm3DMaze.hDC, Pen)
  444.       rc = MoveToEx(frm3DMaze.hDC, LineX1, LineY1, 0)
  445.       rc = LineTo(frm3DMaze.hDC, LineX2, LineY2)
  446.       rc = SelectObject(frm3DMaze.hDC, PreviousPen)
  447.       rc = DeleteObject(Pen)
  448.     End If
  449.   End If
  450. End Sub
  451. Private Sub Hash(Counter0 As Byte, Counter1 As Byte, Counter2 As Byte, Counter3 As Byte, Counter4 As Byte, Counter5 As Byte, Counter6 As Byte, Counter7 As Byte)
  452.   Dim Iteration As Byte
  453.   Dim Seed0 As Byte
  454.   Dim Seed1 As Byte
  455.   Dim Seed2 As Byte
  456.   Dim Seed3 As Byte
  457.   Dim Seed4 As Byte
  458.   Dim Seed5 As Byte
  459.   Dim Seed6 As Byte
  460.   Dim Seed7 As Byte
  461.   Dim SubstitutionIndex As Byte
  462.   Dim Tem0 As Byte
  463.   Dim Tem1 As Byte
  464.   Dim Tem2 As Byte
  465.   Seed0 = Counter0
  466.   Seed1 = Counter1
  467.   Seed2 = Counter2
  468.   Seed3 = Counter3
  469.   Seed4 = Counter4
  470.   Seed5 = Counter5
  471.   Seed6 = Counter6
  472.   Seed7 = Counter7
  473.   For Iteration = 1 To 8
  474.     SubstitutionIndex = 10 * Seed1 + Seed0
  475.     Tem0 = SubstitutionLow(SubstitutionIndex)
  476.     Tem1 = SubstitutionHigh(SubstitutionIndex)
  477.     SubstitutionIndex = 10 * Seed3 + Seed2
  478.     Seed0 = SubstitutionLow(SubstitutionIndex)
  479.     Tem2 = SubstitutionHigh(SubstitutionIndex)
  480.     SubstitutionIndex = 10 * Seed5 + Seed4
  481.     Seed2 = SubstitutionLow(SubstitutionIndex)
  482.     Seed1 = SubstitutionHigh(SubstitutionIndex)
  483.     SubstitutionIndex = 10 * Seed7 + Seed6
  484.     Seed5 = SubstitutionLow(SubstitutionIndex)
  485.     Seed7 = SubstitutionHigh(SubstitutionIndex)
  486.     Seed3 = Tem0
  487.     Seed6 = Tem1
  488.     Seed4 = Tem2
  489.   Next Iteration
  490.   Counter0 = Seed0
  491.   Counter1 = Seed1
  492.   Counter2 = Seed2
  493.   Counter3 = Seed3
  494.   Counter4 = Seed4
  495.   Counter5 = Seed5
  496.   Counter6 = Seed6
  497.   Counter7 = Seed7
  498. End Sub
  499. Private Sub Increment(Counter0 As Byte, Counter1 As Byte, Counter2 As Byte, Counter3 As Byte, Counter4 As Byte, Counter5 As Byte, Counter6 As Byte, Counter7 As Byte)
  500.   Dim tem As Byte
  501.   tem = Counter0 + 1
  502.   If tem <= 9 Then
  503.     Counter0 = tem
  504.   Else
  505.     Counter0 = 0
  506.     tem = Counter1 + 1
  507.     If tem <= 9 Then
  508.       Counter1 = tem
  509.     Else
  510.       Counter1 = 0
  511.       tem = Counter2 + 1
  512.       If tem <= 9 Then
  513.         Counter2 = tem
  514.       Else
  515.         Counter2 = 0
  516.         tem = Counter3 + 1
  517.         If tem <= 9 Then
  518.           Counter3 = tem
  519.         Else
  520.           Counter3 = 0
  521.           tem = Counter4 + 1
  522.           If tem <= 9 Then
  523.             Counter4 = tem
  524.           Else
  525.             Counter4 = 0
  526.             tem = Counter5 + 1
  527.             If tem <= 9 Then
  528.               Counter5 = tem
  529.             Else
  530.               Counter5 = 0
  531.               tem = Counter6 + 1
  532.               If tem <= 9 Then
  533.                 Counter6 = tem
  534.               Else
  535.                 Counter6 = 0
  536.                 tem = Counter7 + 1
  537.                 If tem <= 9 Then
  538.                   Counter7 = tem
  539.                 Else
  540.                   Counter7 = 0
  541.                 End If
  542.               End If
  543.             End If
  544.           End If
  545.         End If
  546.       End If
  547.     End If
  548.   End If
  549. End Sub
  550. Private Sub HexDisplaySolution(MaxY As Integer, Page() As Byte, XMax As Double, XOffset As Double, YMax As Double, CosTilt As Double, SinTilt As Double, PixelsPerX As Double, PixelsPerZ As Double, RelDistOfUserFromScreen As Double)
  551.   Dim DeltaIndex As Byte
  552.   Dim OldPaletteHandle As Long
  553.   Dim PathFound As Integer
  554.   Dim X As Integer
  555.   Dim XNext As Integer
  556.   Dim XPrevious As Integer
  557.   Dim XRelative As Double
  558.   Dim XRelativeNext As Double
  559.   Dim Y As Integer
  560.   Dim YNext As Integer
  561.   Dim YPrevious As Integer
  562.   Dim YRelative As Double
  563.   Dim YRelativeNext As Double
  564.   If UsePalette Then
  565.     OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  566.     NumRealized = RealizePalette(frm3DMaze.hDC)
  567.   End If
  568.   XRelative = 1#
  569.   YRelative = Sqrt3 / 2#
  570.   CurrentColor = SolutionColor
  571.   Call DrawLine(1#, 0#, XRelative, YRelative, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  572.   XPrevious = 3
  573.   YPrevious = -2
  574.   X = 3
  575.   Y = 2
  576.     PathFound = False
  577.     DeltaIndex = 0
  578.     Do While (Not PathFound)
  579.       XNext = X + HexDeltaX(DeltaIndex, 0)
  580.       YNext = Y + HexDeltaY(DeltaIndex, 0)
  581.       If Page(YNext, XNext) = 1 Then
  582.         XNext = XNext + HexDeltaX(DeltaIndex, 0)
  583.         YNext = YNext + HexDeltaY(DeltaIndex, 0)
  584.         If (XNext <> XPrevious) Or (YNext <> YPrevious) Then
  585.           PathFound = True
  586.         Else
  587.           DeltaIndex = DeltaIndex + 1
  588.         End If
  589.       Else
  590.         DeltaIndex = DeltaIndex + 1
  591.       End If
  592.     Loop
  593.     If YNext < MaxY Then
  594.       Select Case YNext - Y
  595.         Case -4
  596.           XRelativeNext = XRelative
  597.           YRelativeNext = YRelative - Sqrt3
  598.         Case -2
  599.           If XNext > X Then
  600.             XRelativeNext = XRelative + 3# / 2#
  601.             YRelativeNext = YRelative - Sqrt3 / 2#
  602.           Else
  603.             XRelativeNext = XRelative - 3# / 2#
  604.             YRelativeNext = YRelative - Sqrt3 / 2#
  605.           End If
  606.         Case 2
  607.           If XNext > X Then
  608.             XRelativeNext = XRelative + 3# / 2#
  609.             YRelativeNext = YRelative + Sqrt3 / 2#
  610.           Else
  611.             XRelativeNext = XRelative - 3# / 2#
  612.             YRelativeNext = YRelative + Sqrt3 / 2#
  613.           End If
  614.         Case Else
  615.           XRelativeNext = XRelative
  616.           YRelativeNext = YRelative + Sqrt3
  617.       End Select
  618.       Call DrawLine(XRelative, YRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  619.     Else
  620.       Call DrawLine(XRelative, YRelative, XRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  621.     End If
  622.     XPrevious = X
  623.     YPrevious = Y
  624.     X = XNext
  625.     Y = YNext
  626.     XRelative = XRelativeNext
  627.     YRelative = YRelativeNext
  628.   Loop While YNext < MaxY
  629.   If UsePalette Then
  630.     NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  631.   End If
  632. End Sub
  633. Private Sub HexDisplayUserMoves(MaxX As Integer, MaxY As Integer, Page() As Byte, XMax As Double, XOffset As Double, YMax As Double, CosTilt As Double, SinTilt As Double, PixelsPerX As Double, PixelsPerZ As Double, RelDistOfUserFromScreen As Double)
  634.   Dim DeltaIndex As Byte
  635.   Dim EvenRow As Boolean
  636.   Dim OldPaletteHandle As Long
  637.   Dim X As Integer
  638.   Dim XNext As Integer
  639.   Dim XNextNext As Integer
  640.   Dim XRelative As Double
  641.   Dim XRelativeNext As Double
  642.   Dim Y As Integer
  643.   Dim YNext As Integer
  644.   Dim YNextNext As Integer
  645.   Dim YRelative As Double
  646.   Dim YRelativeNext As Double
  647.   If UsePalette Then
  648.     OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  649.     NumRealized = RealizePalette(frm3DMaze.hDC)
  650.   End If
  651.   Y = 2
  652.   YRelative = Sqrt3 / 2#
  653.   EvenRow = False
  654.   Do While (Y < MaxY)
  655.     If EvenRow Then
  656.       X = 7
  657.       XRelative = 2.5
  658.     Else
  659.       X = 3
  660.       XRelative = 1#
  661.     End If
  662.     Do While (X < MaxX)
  663.       If ((Page(Y, X) = 1) Or (Page(Y, X) = 3)) Then
  664.         For DeltaIndex = 0 To 5
  665.           XNext = X + HexDeltaX(DeltaIndex, 0)
  666.           YNext = Y + HexDeltaY(DeltaIndex, 0)
  667.           If Page(YNext, XNext) <> 0 Then
  668.             If YNext = 0 Then
  669.               CurrentColor = AdvanceColor
  670.               Call DrawLine(1#, 0#, XRelative, YRelative, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  671.             Else
  672.               If YNext = MaxY Then
  673.                 If UserHasSolved Then
  674.                   CurrentColor = AdvanceColor
  675.                   YRelativeNext = YRelative + Sqrt3 / 2#
  676.                   Call DrawLine(XRelative, YRelative, XRelative, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  677.                 End If
  678.               Else
  679.                 XNextNext = XNext + HexDeltaX(DeltaIndex, 0)
  680.                 If XNextNext > 0 Then
  681.                   If XNextNext < MaxX Then
  682.                     YNextNext = YNext + HexDeltaY(DeltaIndex, 0)
  683.                     If YNextNext > 0 Then
  684.                       If YNextNext < MaxY Then
  685.                         If ((Page(YNextNext, XNextNext) = 1) Or (Page(YNextNext, XNextNext) = 3)) Then
  686.                           If Page(Y, X) = Page(YNextNext, XNextNext) Then
  687.                             If Page(Y, X) = 1 Then
  688.                               CurrentColor = AdvanceColor
  689.                             Else
  690.                               CurrentColor = BackoutColor
  691.                             End If
  692.                           Else
  693.                             CurrentColor = BackoutColor
  694.                           End If
  695.                           Select Case (YNext - Y)
  696.                             Case -2
  697.                               XRelativeNext = XRelative
  698.                               YRelativeNext = YRelative - Sqrt3 / 2#
  699.                             Case -1
  700.                               If XNext > X Then
  701.                                 XRelativeNext = XRelative + 3# / 4#
  702.                                 YRelativeNext = YRelative - Sqrt3 / 4#
  703.                               Else
  704.                                 XRelativeNext = XRelative - 3# / 4#
  705.                                 YRelativeNext = YRelative - Sqrt3 / 4#
  706.                               End If
  707.                             Case 1
  708.                               If XNext > X Then
  709.                                 XRelativeNext = XRelative + 3# / 4#
  710.                                 YRelativeNext = YRelative + Sqrt3 / 4#
  711.                               Else
  712.                                 XRelativeNext = XRelative - 3# / 4#
  713.                                 YRelativeNext = YRelative + Sqrt3 / 4#
  714.                               End If
  715.                             Case Else
  716.                               XRelativeNext = XRelative
  717.                               YRelativeNext = YRelative + Sqrt3 / 2#
  718.                           End Select
  719.                           Call DrawLine(XRelative, YRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  720.                         End If
  721.                        End If
  722.                     End If
  723.                   End If
  724.                 End If
  725.               End If
  726.             End If
  727.           End If
  728.         Next DeltaIndex
  729.       End If
  730.       XRelative = XRelative + 3#
  731.       X = X + 8
  732.     Loop
  733.     EvenRow = Not EvenRow
  734.     YRelative = YRelative + Sqrt3 / 2#
  735.     Y = Y + 2
  736.   Loop
  737.   If UsePalette Then
  738.     NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  739.   End If
  740. End Sub
  741. Private Sub HexSolveMaze(Stack() As StackRec, Page() As Byte, NumRoomsInSolution As Integer, Adjacency As Integer, MaxX As Integer, MaxY As Integer)
  742.   Dim DeltaIndex As Byte
  743.   Dim PassageFound As Integer
  744.   Dim StackHead As Integer
  745.   Dim X As Integer
  746.   Dim XNext As Integer
  747.   Dim Y As Integer
  748.   Dim YNext As Integer
  749.   NumRoomsInSolution = 1
  750.   Adjacency = 0
  751.   X = 3
  752.   Y = 2
  753.   StackHead = -1
  754.   Page(Y, X) = 1
  755.     DeltaIndex = 0
  756.     PassageFound = False
  757.     Do
  758.       Do While ((DeltaIndex < 6) And (Not PassageFound))
  759.         XNext = X + HexDeltaX(DeltaIndex, 0)
  760.         YNext = Y + HexDeltaY(DeltaIndex, 0)
  761.         If Page(YNext, XNext) = 2 Then
  762.           PassageFound = True
  763.         Else
  764.           DeltaIndex = DeltaIndex + 1
  765.         End If
  766.       Loop
  767.       If Not PassageFound Then
  768.         DeltaIndex = Stack(StackHead).Index1
  769.         Page(Y, X) = 2
  770.         X = X - HexDeltaX(DeltaIndex, 0)
  771.         Y = Y - HexDeltaY(DeltaIndex, 0)
  772.         Page(Y, X) = 2
  773.         X = X - HexDeltaX(DeltaIndex, 0)
  774.         Y = Y - HexDeltaY(DeltaIndex, 0)
  775.         StackHead = StackHead - 1
  776.         DeltaIndex = DeltaIndex + 1
  777.       End If
  778.     Loop While Not PassageFound
  779.     Page(YNext, XNext) = 1
  780.     XNext = XNext + HexDeltaX(DeltaIndex, 0)
  781.     YNext = YNext + HexDeltaY(DeltaIndex, 0)
  782.     If YNext <= MaxY Then
  783.       StackHead = StackHead + 1
  784.       Stack(StackHead).Index1 = DeltaIndex
  785.       Page(YNext, XNext) = 1
  786.       X = XNext
  787.       Y = YNext
  788.     End If
  789.   Loop While YNext < MaxY
  790.   X = MaxX - 3
  791.   Y = MaxY - 2
  792.   Adjacency = 0
  793.   Do While (StackHead >= 0)
  794.     For DeltaIndex = 0 To 5
  795.       XNext = X + HexDeltaX(DeltaIndex, 0)
  796.       YNext = Y + HexDeltaY(DeltaIndex, 0)
  797.       If Page(YNext, XNext) <> 1 Then
  798.         If Page(YNext, XNext) = 0 Then
  799.           XNext = XNext + HexDeltaX(DeltaIndex, 0)
  800.           YNext = YNext + HexDeltaY(DeltaIndex, 0)
  801.           If XNext < 0 Then
  802.             Adjacency = Adjacency + 1
  803.           Else
  804.             If XNext > MaxX Then
  805.               Adjacency = Adjacency + 1
  806.             Else
  807.               If YNext < 0 Then
  808.                 Adjacency = Adjacency + 1
  809.               Else
  810.                 If YNext > MaxY Then
  811.                   Adjacency = Adjacency + 1
  812.                 Else
  813.                   If Page(YNext, XNext) = 1 Then
  814.                     Adjacency = Adjacency + 1
  815.                   End If
  816.                 End If
  817.               End If
  818.             End If
  819.           End If
  820.         End If
  821.       End If
  822.     Next DeltaIndex
  823.     X = X - 2 * HexDeltaX(Stack(StackHead).Index1, 0)
  824.     Y = Y - 2 * HexDeltaY(Stack(StackHead).Index1, 0)
  825.     StackHead = StackHead - 1
  826.     NumRoomsInSolution = NumRoomsInSolution + 1
  827.   Loop
  828.   For DeltaIndex = 0 To 5
  829.     XNext = X + HexDeltaX(DeltaIndex, 0)
  830.     YNext = X + HexDeltaY(DeltaIndex, 0)
  831.     If Page(YNext, XNext) <> 2 Then
  832.       If Page(YNext, XNext) = 0 Then
  833.         XNext = XNext + HexDeltaX(DeltaIndex, 0)
  834.         YNext = YNext + HexDeltaY(DeltaIndex, 0)
  835.         If XNext < 0 Then
  836.           Adjacency = Adjacency + 1
  837.         Else
  838.           If XNext > MaxX Then
  839.             Adjacency = Adjacency + 1
  840.           Else
  841.             If YNext < 0 Then
  842.               Adjacency = Adjacency + 1
  843.             Else
  844.               If YNext > MaxY Then
  845.                 Adjacency = Adjacency + 1
  846.               Else
  847.                 If Page(YNext, XNext) = 1 Then
  848.                   Adjacency = Adjacency + 1
  849.                 End If
  850.               End If
  851.             End If
  852.           End If
  853.         End If
  854.       End If
  855.     End If
  856.   Next DeltaIndex
  857. End Sub
  858. Private Sub HexGenerateMaze(Page() As Byte, MaxX As Integer, MaxY As Integer, Stack() As StackRec, NumColumns As Integer, NumRows As Integer, Seed() As Byte)
  859.   Dim ColumnNum As Integer
  860.   Dim DeltaIndex1 As Integer
  861.   Dim DeltaIndex2 As Integer
  862.   Dim PassageFound As Integer
  863.   Dim RN(7) As Integer
  864.   Dim RNIndex1 As Integer
  865.   Dim RNIndex2 As Integer
  866.   Dim RowNum As Integer
  867.   Dim SearchComplete As Integer
  868.   Dim StackHead As Integer
  869.   Dim TemInt As Integer
  870.   Dim X As Integer
  871.   Dim XMod8 As Byte
  872.   Dim XNext As Integer
  873.   Dim Y As Integer
  874.   Dim YMod4 As Byte
  875.   Dim YNext As Integer
  876.   RN(0) = Seed(0) + 1
  877.   RN(1) = Seed(1) + 1
  878.   RN(2) = Seed(2) + 1
  879.   RN(3) = Seed(3) + 1
  880.   RN(4) = Seed(4) + 1
  881.   RN(5) = Seed(5) + 1
  882.   RN(6) = Seed(6) + 1
  883.   RN(7) = Seed(7) + 1
  884.   YMod4 = 1
  885.   For Y = 0 To MaxY
  886.     If YMod4 = 1 Then
  887.       XMod8 = 1
  888.       For X = 0 To MaxX
  889.         If (((XMod8 = 0) And (Y <> 0) And (Y <> MaxY)) Or (XMod8 = 3) Or (XMod8 = 4) Or (XMod8 = 5)) Then
  890.           Page(Y, X) = 0
  891.         Else
  892.           Page(Y, X) = 2
  893.         End If
  894.         XMod8 = XMod8 + 1
  895.         If XMod8 >= 8 Then XMod8 = 0
  896.       Next X
  897.     Else
  898.       If YMod4 = 0 Or YMod4 = 2 Then
  899.         XMod8 = 1
  900.         For X = 0 To MaxX
  901.           If (XMod8 = 2) Or (XMod8 = 6) Then
  902.             Page(Y, X) = 0
  903.           Else
  904.             Page(Y, X) = 2
  905.           End If
  906.           XMod8 = XMod8 + 1
  907.           If XMod8 >= 8 Then XMod8 = 0
  908.         Next X
  909.       Else
  910.         XMod8 = 1
  911.         For X = 0 To MaxX
  912.           If (XMod8 = 0) Or (XMod8 = 1) Or (XMod8 = 4) Or (XMod8 = 7) Then
  913.             Page(Y, X) = 0
  914.           Else
  915.             Page(Y, X) = 2
  916.           End If
  917.           XMod8 = XMod8 + 1
  918.           If XMod8 >= 8 Then XMod8 = 0
  919.         Next X
  920.       End If
  921.     End If
  922.     YMod4 = YMod4 + 1
  923.     If YMod4 >= 4 Then YMod4 = 0
  924.   Next Y
  925.   ColumnNum = RN(0)
  926.   RNIndex1 = 0
  927.   RNIndex2 = 1
  928.   Do While (RNIndex2 < 8)
  929.     TemInt = RN(RNIndex2)
  930.     RN(RNIndex1) = TemInt
  931.     ColumnNum = ColumnNum + TemInt
  932.     If ColumnNum >= 727 Then ColumnNum = ColumnNum - 727
  933.     RNIndex1 = RNIndex2
  934.     RNIndex2 = RNIndex2 + 1
  935.   Loop
  936.   RN(7) = ColumnNum
  937.   ColumnNum = ColumnNum Mod NumColumns
  938.   X = 4 * ColumnNum + 3
  939.   RowNum = RN(0)
  940.   RNIndex1 = 0
  941.   RNIndex2 = 1
  942.   Do While (RNIndex2 < 8)
  943.     TemInt = RN(RNIndex2)
  944.     RN(RNIndex1) = TemInt
  945.     RowNum = RowNum + TemInt
  946.     If RowNum >= 727 Then RowNum = RowNum - 727
  947.     RNIndex1 = RNIndex2
  948.     RNIndex2 = RNIndex2 + 1
  949.   Loop
  950.   RN(7) = RowNum
  951.   If ColumnNum Mod 2 Then
  952.     RowNum = RowNum Mod (NumRows - 1)
  953.     Y = 4 * RowNum + 4
  954.   Else
  955.     RowNum = RowNum Mod NumRows
  956.     Y = 4 * RowNum + 2
  957.   End If
  958.   Page(Y, X) = 2
  959.   StackHead = -1
  960.     DeltaIndex1 = 0
  961.     Do
  962.       DeltaIndex2 = RN(0)
  963.       RNIndex1 = 0
  964.       RNIndex2 = 1
  965.       Do While (RNIndex2 < 8)
  966.         TemInt = RN(RNIndex2)
  967.         RN(RNIndex1) = TemInt
  968.         DeltaIndex2 = DeltaIndex2 + TemInt
  969.         If DeltaIndex2 >= 727 Then DeltaIndex2 = DeltaIndex2 - 727
  970.         RNIndex1 = RNIndex2
  971.         RNIndex2 = RNIndex2 + 1
  972.       Loop
  973.       RN(7) = DeltaIndex2
  974.     Loop While DeltaIndex2 >= 720
  975.     PassageFound = False
  976.     SearchComplete = False
  977.     Do While (Not SearchComplete)
  978.       Do While ((DeltaIndex1 < 6) And (Not PassageFound))
  979.         XNext = X + 2 * HexDeltaX(DeltaIndex1, DeltaIndex2)
  980.         If XNext <= 0 Then
  981.           DeltaIndex1 = DeltaIndex1 + 1
  982.         Else
  983.           If XNext > MaxX Then
  984.             DeltaIndex1 = DeltaIndex1 + 1
  985.           Else
  986.             YNext = Y + 2 * HexDeltaY(DeltaIndex1, DeltaIndex2)
  987.             If YNext <= 0 Then
  988.               DeltaIndex1 = DeltaIndex1 + 1
  989.             Else
  990.               If YNext > MaxY Then
  991.                 DeltaIndex1 = DeltaIndex1 + 1
  992.               Else
  993.                 If Page(YNext, XNext) = 0 Then
  994.                   PassageFound = True
  995.                 Else
  996.                   DeltaIndex1 = DeltaIndex1 + 1
  997.                 End If
  998.               End If
  999.             End If
  1000.           End If
  1001.         End If
  1002.       Loop
  1003.       If Not PassageFound Then
  1004.         If StackHead >= 0 Then
  1005.           DeltaIndex1 = Stack(StackHead).Index1
  1006.           DeltaIndex2 = Stack(StackHead).Index2
  1007.           X = X - 2 * HexDeltaX(DeltaIndex1, DeltaIndex2)
  1008.           Y = Y - 2 * HexDeltaY(DeltaIndex1, DeltaIndex2)
  1009.           StackHead = StackHead - 1
  1010.           DeltaIndex1 = DeltaIndex1 + 1
  1011.         End If
  1012.       End If
  1013.       If ((PassageFound) Or ((StackHead = -1) And (DeltaIndex1 >= 6))) Then
  1014.         SearchComplete = True
  1015.       Else
  1016.         SearchComplete = False
  1017.       End If
  1018.     Loop
  1019.     If PassageFound Then
  1020.       StackHead = StackHead + 1
  1021.       Stack(StackHead).Index1 = DeltaIndex1
  1022.       Stack(StackHead).Index2 = DeltaIndex2
  1023.       Page(YNext, XNext) = 2
  1024.       Page((Y + YNext) \ 2, (X + XNext) \ 2) = 2
  1025.       X = XNext
  1026.       Y = YNext
  1027.     End If
  1028.   Loop While StackHead <> -1
  1029.   Page(0, 3) = 1
  1030.   Page(MaxY, MaxX - 3) = 2
  1031. End Sub
  1032. Private Sub HexSelectMaze(Seed As String, Page() As Byte, MaxX As Integer, MaxY As Integer, Stack() As StackRec, NumRoomsInMaze As Integer, NumColumns As Integer, NumRows As Integer, SecondsForMazeSelection As Double)
  1033.   Dim Adjacency As Integer
  1034.   Dim Counter0 As Byte
  1035.   Dim Counter1 As Byte
  1036.   Dim Counter2 As Byte
  1037.   Dim Counter3 As Byte
  1038.   Dim Counter4 As Byte
  1039.   Dim Counter5 As Byte
  1040.   Dim Counter6 As Byte
  1041.   Dim Counter7 As Byte
  1042.   Dim ElapsedTime As Double
  1043.   Dim MinAdjacency As Integer
  1044.   Dim NumRoomsInSolution As Integer
  1045.   Dim NumRoomsInSolutionAtMin As Integer
  1046.   Dim RN(7) As Integer
  1047.   Dim RNIndex1 As Integer
  1048.   Dim RNIndex2 As Integer
  1049.   Dim SeedByte(7) As Byte
  1050.   Dim SeedByteAtMin(7) As Byte
  1051.   Dim SeedLength As Integer
  1052.   Dim StartTime As Double
  1053.   SeedLength = Len(Seed)
  1054.   If SeedLength > 8 Then SeedLength = 8
  1055.   RNIndex1 = 0
  1056.   For RNIndex2 = 1 To SeedLength
  1057.     RN(RNIndex1) = Asc(Mid$(Seed, RNIndex2, 1)) Mod 10
  1058.     RNIndex1 = RNIndex1 + 1
  1059.   Next RNIndex2
  1060.   RNIndex2 = 7
  1061.   Do While (RNIndex1 > 0)
  1062.     RNIndex1 = RNIndex1 - 1
  1063.     RN(RNIndex2) = RN(RNIndex1)
  1064.     RNIndex2 = RNIndex2 - 1
  1065.   Loop
  1066.   Do While (RNIndex2 >= 0)
  1067.     RN(RNIndex2) = 8
  1068.     RNIndex2 = RNIndex2 - 1
  1069.   Loop
  1070.   Counter0 = RN(0)
  1071.   Counter1 = RN(1)
  1072.   Counter2 = RN(2)
  1073.   Counter3 = RN(3)
  1074.   Counter4 = RN(4)
  1075.   Counter5 = RN(5)
  1076.   Counter6 = RN(6)
  1077.   Counter7 = RN(7)
  1078.   Call Hash(Counter0, Counter1, Counter2, Counter3, Counter4, Counter5, Counter6, Counter7)
  1079.   MinAdjacency = 4 * NumRoomsInMaze + 1
  1080.   NumRoomsInSolutionAtMin = 0
  1081.   SeedByteAtMin(0) = Counter0
  1082.   SeedByteAtMin(1) = Counter1
  1083.   SeedByteAtMin(2) = Counter2
  1084.   SeedByteAtMin(3) = Counter3
  1085.   SeedByteAtMin(4) = Counter4
  1086.   SeedByteAtMin(5) = Counter5
  1087.   SeedByteAtMin(6) = Counter6
  1088.   SeedByteAtMin(7) = Counter7
  1089.   StartTime = Timer
  1090.     SeedByte(0) = Counter0
  1091.     SeedByte(1) = Counter1
  1092.     SeedByte(2) = Counter2
  1093.     SeedByte(3) = Counter3
  1094.     SeedByte(4) = Counter4
  1095.     SeedByte(5) = Counter5
  1096.     SeedByte(6) = Counter6
  1097.     SeedByte(7) = Counter7
  1098.     Call HexGenerateMaze(Page(), MaxX, MaxY, Stack(), NumColumns, NumRows, SeedByte())
  1099.     Call HexSolveMaze(Stack(), Page(), NumRoomsInSolution, Adjacency, MaxX, MaxY)
  1100.     If 3 * NumRoomsInSolution >= NumRoomsInMaze Then
  1101.       If Adjacency < MinAdjacency Then
  1102.         MinAdjacency = Adjacency
  1103.         NumRoomsInSolutionAtMin = NumRoomsInSolution
  1104.         SeedByteAtMin(0) = SeedByte(0)
  1105.         SeedByteAtMin(1) = SeedByte(1)
  1106.         SeedByteAtMin(2) = SeedByte(2)
  1107.         SeedByteAtMin(3) = SeedByte(3)
  1108.         SeedByteAtMin(4) = SeedByte(4)
  1109.         SeedByteAtMin(5) = SeedByte(5)
  1110.         SeedByteAtMin(6) = SeedByte(6)
  1111.         SeedByteAtMin(7) = SeedByte(7)
  1112.       Else
  1113.         If Adjacency = MinAdjacency Then
  1114.           If NumRoomsInSolution > NumRoomsInSolutionAtMin Then
  1115.             NumRoomsInSolutionAtMin = NumRoomsInSolution
  1116.             SeedByteAtMin(0) = SeedByte(0)
  1117.             SeedByteAtMin(1) = SeedByte(1)
  1118.             SeedByteAtMin(2) = SeedByte(2)
  1119.             SeedByteAtMin(3) = SeedByte(3)
  1120.             SeedByteAtMin(4) = SeedByte(4)
  1121.             SeedByteAtMin(5) = SeedByte(5)
  1122.             SeedByteAtMin(6) = SeedByte(6)
  1123.             SeedByteAtMin(7) = SeedByte(7)
  1124.           End If
  1125.         End If
  1126.       End If
  1127.     End If
  1128.     Call Increment(Counter0, Counter1, Counter2, Counter3, Counter4, Counter5, Counter6, Counter7)
  1129.     ElapsedTime = Timer - StartTime
  1130.   Loop While ((ElapsedTime >= 0#) And (ElapsedTime < SecondsForMazeSelection))
  1131.   Call HexGenerateMaze(Page(), MaxX, MaxY, Stack(), NumColumns, NumRows, SeedByteAtMin())
  1132.   Call HexSolveMaze(Stack(), Page(), NumRoomsInSolution, Adjacency, MaxX, MaxY)
  1133. End Sub
  1134. Private Sub HexOutputMaze()
  1135.   Dim ObjectNum As Byte
  1136.   Dim Radians As Double
  1137.   Dim RadiansPerDegree As Double
  1138.   Dim SingleRectangle(3) As VertexRec
  1139.   Dim SingleTriangle(2) As VertexRec
  1140.   Dim TemDouble1 As Double
  1141.   Dim TemDouble2 As Double
  1142.   Dim TemDouble3 As Double
  1143.   Dim TemDouble4 As Double
  1144.   Dim Triangle(3, 2) As VertexRec
  1145.   Dim VertexNum As Byte
  1146.   Dim XMod8 As Byte
  1147.   Dim X0 As Double
  1148.   Dim X1 As Double
  1149.   Dim X2 As Double
  1150.   Dim X3 As Double
  1151.   Dim Y0 As Double
  1152.   Dim Y1 As Double
  1153.   Dim Y2 As Double
  1154.   Dim Y3 As Double
  1155.   Select Case State
  1156.     Case 0
  1157.       Text1.Text = ""
  1158.       ScaleMode = 1
  1159.       If (Resize) Then
  1160.         TemDouble1 = ScaleWidth - VScroll1.Width
  1161.         TemDouble2 = MinWallLengthInInches
  1162.         TemDouble2 = 1440# * TemDouble2
  1163.         TemDouble3 = RelativeWidthOfWall
  1164.         NumColumns = Int(2# * (TemDouble1 / TemDouble2 - 2# - TemDouble3 / Sqrt3) / 3# + 1#)
  1165.         If NumColumns Mod 2 = 0 Then NumColumns = NumColumns - 1
  1166.         If NumColumns < 3 Then NumColumns = 3
  1167.         TemDouble1 = ScaleHeight - Text1.Height
  1168.         TemDouble2 = ScaleWidth - VScroll1.Width
  1169.         ScaleMode = 3
  1170.         TemDouble3 = NumColumns
  1171.         TemDouble4 = RelativeWidthOfWall
  1172.         NumRows = Int(((TemDouble1 / TemDouble2) * (3# * (TemDouble3 - 1#) / 2# + 2# + TemDouble4 / Sqrt3) - TemDouble4) / Sqrt3)
  1173.         If NumRows < 2 Then NumRows = 2
  1174.         Tilt = 90 - ScrollValue
  1175.         MaxX = 8 * (NumColumns \ 2) + 6
  1176.         MaxY = 4 * NumRows
  1177.         NumRoomsInMaze = NumRows * NumColumns - (NumColumns \ 2)
  1178.         ReDim ComputerPage(MaxY, MaxX)
  1179.         ReDim UserPage(MaxY, MaxX)
  1180.         ReDim Stack(NumRoomsInMaze)
  1181.         Call HexSelectMaze(Seed, ComputerPage(), MaxX, MaxY, Stack(), NumRoomsInMaze, NumColumns, NumRows, SecondsForMazeSelection)
  1182.         For UserX = 0 To MaxX
  1183.           For UserY = 0 To MaxY
  1184.             If ComputerPage(UserY, UserX) = 0 Then
  1185.               UserPage(UserY, UserX) = 0
  1186.             Else
  1187.               UserPage(UserY, UserX) = 2
  1188.             End If
  1189.           Next UserY
  1190.         Next UserX
  1191.         UserX = 3
  1192.         UserXRelative = 1#
  1193.         UserY = 2
  1194.         UserYRelative = Sqrt3 / 2#
  1195.         UserPage(UserY, UserX) = 1
  1196.         Resize = False
  1197.       End If
  1198.       If (Paint) Then
  1199.         ScaleMode = 3
  1200.         Cls
  1201.         RadiansPerDegree = Atn(1#) / 45#
  1202.         Radians = Tilt * RadiansPerDegree
  1203.         SinTilt = Sin(Radians)
  1204.         CosTilt = Cos(Radians)
  1205.         TemDouble1 = NumColumns
  1206.         XMax = 3# * (TemDouble1 - 1#) / 2# + 2# + RelativeWidthOfWall / Sqrt3
  1207.         TemDouble1 = ScaleWidth - VScroll1.Width
  1208.         PixelsPerX = (TemDouble1 - 1#) / (XMax * (XMax / (XMax - RelativeHeightOfWall)))
  1209.         XOffset = (XMax / 2#) * (RelativeHeightOfWall / (XMax - RelativeHeightOfWall))
  1210.         TemDouble1 = NumRows
  1211.         YMax = TemDouble1 * Sqrt3 + RelativeWidthOfWall
  1212.         TemDouble1 = ScaleHeight - Text1.Height
  1213.         PixelsPerZ = (TemDouble1 - 1#) / Sqr(YMax * YMax + RelativeHeightOfWall * RelativeHeightOfWall)
  1214.         If YMax > XMax Then
  1215.           RelDistOfUserFromScreen = YMax
  1216.         Else
  1217.           RelDistOfUserFromScreen = XMax
  1218.         End If
  1219.         Paint = False
  1220.       End If
  1221.       If State = 0 Then
  1222.         State = 1
  1223.         DoEvents
  1224.         If State < 5 Then
  1225.           Timer1.Enabled = True
  1226.         End If
  1227.       End If
  1228.     Case 1
  1229.       BaseTriangle(0, 0).X = 0#
  1230.       BaseTriangle(0, 0).Y = RelativeWidthOfWall + Sqrt3 / 2#
  1231.       BaseTriangle(0, 1).X = 0#
  1232.       BaseTriangle(0, 1).Y = Sqrt3 / 2#
  1233.       BaseTriangle(0, 2).X = RelativeWidthOfWall * Sqrt3 / 2#
  1234.       BaseTriangle(0, 2).Y = (RelativeWidthOfWall + Sqrt3) / 2#
  1235.       BaseTriangle(1, 0).X = (1# - RelativeWidthOfWall / Sqrt3) / 2#
  1236.       BaseTriangle(1, 0).Y = RelativeWidthOfWall / 2#
  1237.       BaseTriangle(1, 1).X = 0.5 + RelativeWidthOfWall / Sqrt3
  1238.       BaseTriangle(1, 1).Y = 0#
  1239.       BaseTriangle(1, 2).X = BaseTriangle(1, 1).X
  1240.       BaseTriangle(1, 2).Y = RelativeWidthOfWall
  1241.       BaseTriangle(2, 0).X = 1.5
  1242.       BaseTriangle(2, 0).Y = RelativeWidthOfWall
  1243.       BaseTriangle(2, 1).X = 1.5
  1244.       BaseTriangle(2, 1).Y = 0#
  1245.       BaseTriangle(2, 2).X = 1.5 * (1# + RelativeWidthOfWall / Sqrt3)
  1246.       BaseTriangle(2, 2).Y = RelativeWidthOfWall / 2#
  1247.       BaseTriangle(3, 0).X = 2# - RelativeWidthOfWall / (2# * Sqrt3)
  1248.       BaseTriangle(3, 0).Y = BaseTriangle(0, 2).Y
  1249.       BaseTriangle(3, 1).X = 2# + RelativeWidthOfWall / Sqrt3
  1250.       BaseTriangle(3, 1).Y = BaseTriangle(0, 1).Y
  1251.       BaseTriangle(3, 2).X = BaseTriangle(3, 1).X
  1252.       BaseTriangle(3, 2).Y = BaseTriangle(0, 0).Y
  1253.       BaseRectangle(0, 0).X = BaseTriangle(0, 2).X
  1254.       BaseRectangle(0, 0).Y = BaseTriangle(0, 2).Y
  1255.       BaseRectangle(0, 1).X = BaseTriangle(1, 1).X
  1256.       BaseRectangle(0, 1).Y = Sqrt3
  1257.       BaseRectangle(0, 2).X = BaseTriangle(1, 0).X
  1258.       BaseRectangle(0, 2).Y = Sqrt3 + RelativeWidthOfWall / 2#
  1259.       BaseRectangle(0, 3).X = BaseTriangle(0, 0).X
  1260.       BaseRectangle(0, 3).Y = BaseTriangle(0, 0).Y
  1261.       BaseRectangle(1, 0).X = BaseTriangle(0, 1).X
  1262.       BaseRectangle(1, 0).Y = BaseTriangle(0, 1).Y
  1263.       BaseRectangle(1, 1).X = BaseTriangle(1, 0).X
  1264.       BaseRectangle(1, 1).Y = BaseTriangle(1, 0).Y
  1265.       BaseRectangle(1, 2).X = BaseTriangle(1, 2).X
  1266.       BaseRectangle(1, 2).Y = BaseTriangle(1, 2).Y
  1267.       BaseRectangle(1, 3).X = BaseTriangle(0, 2).X
  1268.       BaseRectangle(1, 3).Y = BaseTriangle(0, 2).Y
  1269.       BaseRectangle(2, 0).X = BaseTriangle(1, 1).X
  1270.       BaseRectangle(2, 0).Y = BaseTriangle(1, 1).Y
  1271.       BaseRectangle(2, 1).X = BaseTriangle(2, 1).X
  1272.       BaseRectangle(2, 1).Y = BaseTriangle(2, 1).Y
  1273.       BaseRectangle(2, 2).X = BaseTriangle(2, 0).X
  1274.       BaseRectangle(2, 2).Y = BaseTriangle(2, 0).Y
  1275.       BaseRectangle(2, 3).X = BaseTriangle(1, 2).X
  1276.       BaseRectangle(2, 3).Y = BaseTriangle(1, 2).Y
  1277.       BaseRectangle(3, 0).X = BaseTriangle(2, 2).X
  1278.       BaseRectangle(3, 0).Y = BaseTriangle(2, 2).Y
  1279.       BaseRectangle(3, 1).X = BaseTriangle(3, 1).X
  1280.       BaseRectangle(3, 1).Y = BaseTriangle(3, 1).Y
  1281.       BaseRectangle(3, 2).X = BaseTriangle(3, 0).X
  1282.       BaseRectangle(3, 2).Y = BaseTriangle(3, 0).Y
  1283.       BaseRectangle(3, 3).X = BaseTriangle(2, 0).X
  1284.       BaseRectangle(3, 3).Y = BaseTriangle(2, 0).Y
  1285.       BaseRectangle(4, 0).X = BaseTriangle(3, 1).X
  1286.       BaseRectangle(4, 0).Y = BaseTriangle(3, 1).Y
  1287.       BaseRectangle(4, 1).X = BaseTriangle(3, 1).X + (BaseTriangle(2, 1).X - BaseTriangle(1, 1).X)
  1288.       BaseRectangle(4, 1).Y = BaseTriangle(3, 1).Y
  1289.       BaseRectangle(4, 2).X = BaseRectangle(4, 1).X
  1290.       BaseRectangle(4, 2).Y = BaseTriangle(3, 2).Y
  1291.       BaseRectangle(4, 3).X = BaseTriangle(3, 2).X
  1292.       BaseRectangle(4, 3).Y = BaseTriangle(3, 2).Y
  1293.       BaseRectangle(5, 0).X = BaseRectangle(0, 1).X + (BaseTriangle(2, 1).X - BaseTriangle(1, 1).X)
  1294.       BaseRectangle(5, 0).Y = BaseRectangle(0, 1).Y
  1295.       BaseRectangle(5, 1).X = BaseTriangle(3, 0).X
  1296.       BaseRectangle(5, 1).Y = BaseTriangle(3, 0).Y
  1297.       BaseRectangle(5, 2).X = BaseTriangle(3, 2).X
  1298.       BaseRectangle(5, 2).Y = BaseTriangle(3, 2).Y
  1299.       BaseRectangle(5, 3).X = BaseRectangle(0, 2).X + (BaseTriangle(2, 2).X - BaseTriangle(1, 0).X)
  1300.       BaseRectangle(5, 3).Y = BaseRectangle(0, 2).Y
  1301.       Rectangle(0, 0).X = BaseTriangle(1, 1).X
  1302.       Rectangle(0, 0).Y = BaseTriangle(1, 1).Y
  1303.       Rectangle(0, 1).X = XMax - BaseTriangle(1, 1).X
  1304.       Rectangle(0, 1).Y = BaseTriangle(1, 1).Y
  1305.       Rectangle(0, 2).X = XMax - BaseTriangle(1, 2).X
  1306.       Rectangle(0, 2).Y = BaseTriangle(1, 2).Y
  1307.       Rectangle(0, 3).X = BaseTriangle(1, 2).X
  1308.       Rectangle(0, 3).Y = BaseTriangle(1, 2).Y
  1309.       Rectangle(1, 0).X = BaseTriangle(0, 1).X
  1310.       Rectangle(1, 0).Y = BaseTriangle(0, 1).Y
  1311.       Rectangle(1, 1).X = XMax - BaseTriangle(0, 1).X
  1312.       Rectangle(1, 1).Y = BaseTriangle(0, 1).Y
  1313.       Rectangle(1, 2).X = XMax - BaseTriangle(1, 2).X
  1314.       Rectangle(1, 2).Y = BaseTriangle(1, 2).Y
  1315.       Rectangle(1, 3).X = BaseTriangle(1, 2).X
  1316.       Rectangle(1, 3).Y = BaseTriangle(1, 2).Y
  1317.       Rectangle(2, 0).X = BaseTriangle(0, 1).X
  1318.       Rectangle(2, 0).Y = BaseTriangle(0, 1).Y
  1319.       Rectangle(2, 1).X = XMax - BaseTriangle(0, 1).X
  1320.       Rectangle(2, 1).Y = BaseTriangle(0, 1).Y
  1321.       Rectangle(2, 2).X = XMax - BaseTriangle(0, 0).X
  1322.       Rectangle(2, 2).Y = BaseTriangle(0, 0).Y
  1323.       Rectangle(2, 3).X = BaseTriangle(0, 0).X
  1324.       Rectangle(2, 3).Y = BaseTriangle(0, 0).Y
  1325.       Rectangle(3, 0).X = BaseTriangle(0, 0).X
  1326.       Rectangle(3, 0).Y = BaseTriangle(0, 0).Y
  1327.       Rectangle(3, 1).X = XMax - BaseTriangle(0, 0).X
  1328.       Rectangle(3, 1).Y = BaseTriangle(0, 0).Y
  1329.       Rectangle(3, 2).X = XMax - BaseRectangle(0, 1).X
  1330.       Rectangle(3, 2).Y = BaseRectangle(0, 1).Y
  1331.       Rectangle(3, 3).X = BaseRectangle(0, 1).X
  1332.       Rectangle(3, 3).Y = BaseRectangle(0, 1).Y
  1333.       Y = 0
  1334.       State = 2
  1335.       DoEvents
  1336.       If State < 5 Then
  1337.         Timer1.Enabled = True
  1338.       End If
  1339.     Case 2
  1340.       If UsePalette Then
  1341.         OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1342.         NumRealized = RealizePalette(frm3DMaze.hDC)
  1343.       End If
  1344.       If (Y <= MaxY - 1) Then
  1345.         If Y > 0 Then
  1346.           X0 = Rectangle(0, 0).X
  1347.           Y0 = Rectangle(0, 0).Y
  1348.           X1 = Rectangle(0, 1).X
  1349.           Y1 = Rectangle(0, 1).Y
  1350.           X2 = Rectangle(0, 2).X
  1351.           Y2 = Rectangle(0, 2).Y
  1352.           X3 = Rectangle(0, 3).X
  1353.           Y3 = Rectangle(0, 3).Y
  1354.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1355.           X0 = Rectangle(1, 0).X
  1356.           Y0 = Rectangle(1, 0).Y
  1357.           X1 = Rectangle(1, 1).X
  1358.           Y1 = Rectangle(1, 1).Y
  1359.           X2 = Rectangle(1, 2).X
  1360.           Y2 = Rectangle(1, 2).Y
  1361.           X3 = Rectangle(1, 3).X
  1362.           Y3 = Rectangle(1, 3).Y
  1363.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1364.         End If
  1365.         X0 = Rectangle(2, 0).X
  1366.         Y0 = Rectangle(2, 0).Y
  1367.         X1 = Rectangle(2, 1).X
  1368.         Y1 = Rectangle(2, 1).Y
  1369.         X2 = Rectangle(2, 2).X
  1370.         Y2 = Rectangle(2, 2).Y
  1371.         X3 = Rectangle(2, 3).X
  1372.         Y3 = Rectangle(2, 3).Y
  1373.         Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1374.         If Y < MaxY - 4 Then
  1375.           X0 = Rectangle(3, 0).X
  1376.           Y0 = Rectangle(3, 0).Y
  1377.           X1 = Rectangle(3, 1).X
  1378.           Y1 = Rectangle(3, 1).Y
  1379.           X2 = Rectangle(3, 2).X
  1380.           Y2 = Rectangle(3, 2).Y
  1381.           X3 = Rectangle(3, 3).X
  1382.           Y3 = Rectangle(3, 3).Y
  1383.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1384.         End If
  1385.         For ObjectNum = 0 To 3
  1386.           For VertexNum = 0 To 3
  1387.             Rectangle(ObjectNum, VertexNum).Y = Rectangle(ObjectNum, VertexNum).Y + Sqrt3
  1388.           Next VertexNum
  1389.         Next ObjectNum
  1390.         Y = Y + 4
  1391.       Else
  1392.         Rectangle(0, 0).X = BaseTriangle(1, 0).X
  1393.         Rectangle(0, 0).Y = BaseTriangle(1, 0).Y
  1394.         Rectangle(0, 1).X = BaseTriangle(1, 1).X
  1395.         Rectangle(0, 1).Y = BaseTriangle(1, 1).Y
  1396.         Rectangle(0, 2).X = BaseTriangle(2, 1).X
  1397.         Rectangle(0, 2).Y = BaseTriangle(2, 1).Y
  1398.         Rectangle(0, 3).X = BaseTriangle(2, 2).X
  1399.         Rectangle(0, 3).Y = BaseTriangle(2, 2).Y
  1400.         Rectangle(1, 0).X = BaseTriangle(0, 1).X
  1401.         Rectangle(1, 0).Y = BaseTriangle(0, 1).Y
  1402.         Rectangle(1, 1).X = BaseTriangle(1, 0).X
  1403.         Rectangle(1, 1).Y = BaseTriangle(1, 0).Y
  1404.         Rectangle(1, 2).X = BaseTriangle(2, 2).X
  1405.         Rectangle(1, 2).Y = BaseTriangle(2, 2).Y
  1406.         Rectangle(1, 3).X = BaseTriangle(3, 1).X
  1407.         Rectangle(1, 3).Y = BaseTriangle(3, 1).Y
  1408.         Rectangle(2, 0).X = BaseTriangle(0, 0).X
  1409.         Rectangle(2, 0).Y = BaseTriangle(0, 0).Y
  1410.         Rectangle(2, 1).X = BaseTriangle(0, 1).X
  1411.         Rectangle(2, 1).Y = BaseTriangle(0, 1).Y
  1412.         Rectangle(2, 2).X = BaseTriangle(3, 1).X
  1413.         Rectangle(2, 2).Y = BaseTriangle(3, 1).Y
  1414.         Rectangle(2, 3).X = BaseTriangle(3, 2).X
  1415.         Rectangle(2, 3).Y = BaseTriangle(3, 2).Y
  1416.         X = 0
  1417.         State = 3
  1418.       End If
  1419.       If UsePalette Then
  1420.         NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1421.       End If
  1422.       DoEvents
  1423.       If State < 5 Then
  1424.         Timer1.Enabled = True
  1425.       End If
  1426.     Case 3
  1427.       If UsePalette Then
  1428.         OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1429.         NumRealized = RealizePalette(frm3DMaze.hDC)
  1430.       End If
  1431.       If X <= MaxX Then
  1432.         For ObjectNum = 0 To 2
  1433.           X0 = Rectangle(ObjectNum, 0).X
  1434.           Y0 = Rectangle(ObjectNum, 0).Y
  1435.           X1 = Rectangle(ObjectNum, 1).X
  1436.           Y1 = Rectangle(ObjectNum, 1).Y
  1437.           X2 = Rectangle(ObjectNum, 2).X
  1438.           Y2 = Rectangle(ObjectNum, 2).Y
  1439.           X3 = Rectangle(ObjectNum, 3).X
  1440.           Y3 = Rectangle(ObjectNum, 3).Y
  1441.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1442.           X0 = Rectangle(ObjectNum, 0).X
  1443.           Y0 = YMax - Rectangle(ObjectNum, 0).Y
  1444.           X1 = Rectangle(ObjectNum, 1).X
  1445.           Y1 = YMax - Rectangle(ObjectNum, 1).Y
  1446.           X2 = Rectangle(ObjectNum, 2).X
  1447.           Y2 = YMax - Rectangle(ObjectNum, 2).Y
  1448.           X3 = Rectangle(ObjectNum, 3).X
  1449.           Y3 = YMax - Rectangle(ObjectNum, 3).Y
  1450.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1451.           For VertexNum = 0 To 3
  1452.             Rectangle(ObjectNum, VertexNum).X = Rectangle(ObjectNum, VertexNum).X + 3#
  1453.           Next VertexNum
  1454.         Next ObjectNum
  1455.         X = X + 8
  1456.       Else
  1457.         YMod4 = 0
  1458.         YOffset = 0#
  1459.         Y = 0
  1460.         State = 4
  1461.       End If
  1462.       If UsePalette Then
  1463.         NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1464.       End If
  1465.       DoEvents
  1466.       If State < 5 Then
  1467.         Timer1.Enabled = True
  1468.       End If
  1469.     Case 4
  1470.       If UsePalette Then
  1471.         OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1472.         NumRealized = RealizePalette(frm3DMaze.hDC)
  1473.       End If
  1474.       If Y <= MaxY Then
  1475.         Select Case YMod4
  1476.           Case 0
  1477.             XMod8 = 0
  1478.             For ObjectNum = 1 To 2
  1479.               For VertexNum = 0 To 2
  1480.                 Triangle(ObjectNum, VertexNum).X = BaseTriangle(ObjectNum, VertexNum).X
  1481.                 Triangle(ObjectNum, VertexNum).Y = BaseTriangle(ObjectNum, VertexNum).Y + YOffset
  1482.               Next VertexNum
  1483.             Next ObjectNum
  1484.             For VertexNum = 0 To 3
  1485.               Rectangle(2, VertexNum).X = BaseRectangle(2, VertexNum).X
  1486.               Rectangle(2, VertexNum).Y = BaseRectangle(2, VertexNum).Y + YOffset
  1487.             Next VertexNum
  1488.             For X = 0 To MaxX
  1489.               Select Case XMod8
  1490.                 Case 2
  1491.                   SingleTriangle(0).X = Triangle(1, 0).X
  1492.                   SingleTriangle(0).Y = Triangle(1, 0).Y
  1493.                   SingleTriangle(1).X = Triangle(1, 1).X
  1494.                   SingleTriangle(1).Y = Triangle(1, 1).Y
  1495.                   SingleTriangle(2).X = Triangle(1, 2).X
  1496.                   SingleTriangle(2).Y = Triangle(1, 2).Y
  1497.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, True, TriangleSSWNNEColor)
  1498.                 Case 4
  1499.                   SingleTriangle(0).X = Triangle(2, 0).X
  1500.                   SingleTriangle(0).Y = Triangle(2, 0).Y
  1501.                   SingleTriangle(1).X = Triangle(2, 1).X
  1502.                   SingleTriangle(1).Y = Triangle(2, 1).Y
  1503.                   SingleTriangle(2).X = Triangle(2, 2).X
  1504.                   SingleTriangle(2).Y = Triangle(2, 2).Y
  1505.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, True, TriangleSSENNWColor)
  1506.                 Case Else
  1507.               End Select
  1508.               XMod8 = XMod8 + 1
  1509.               If XMod8 >= 8 Then
  1510.                 XMod8 = 0
  1511.                 For ObjectNum = 1 To 2
  1512.                   For VertexNum = 0 To 2
  1513.                     Triangle(ObjectNum, VertexNum).X = Triangle(ObjectNum, VertexNum).X + 3#
  1514.                   Next VertexNum
  1515.                 Next ObjectNum
  1516.                 For VertexNum = 0 To 3
  1517.                   Rectangle(2, VertexNum).X = Rectangle(2, VertexNum).X + 3#
  1518.                 Next VertexNum
  1519.               End If
  1520.             Next X
  1521.             XMod8 = 0
  1522.             For ObjectNum = 1 To 2
  1523.               For VertexNum = 0 To 2
  1524.                 Triangle(ObjectNum, VertexNum).X = BaseTriangle(ObjectNum, VertexNum).X
  1525.                 Triangle(ObjectNum, VertexNum).Y = BaseTriangle(ObjectNum, VertexNum).Y + YOffset
  1526.               Next VertexNum
  1527.             Next ObjectNum
  1528.             For VertexNum = 0 To 3
  1529.               Rectangle(2, VertexNum).X = BaseRectangle(2, VertexNum).X
  1530.               Rectangle(2, VertexNum).Y = BaseRectangle(2, VertexNum).Y + YOffset
  1531.             Next VertexNum
  1532.             For X = 0 To MaxX
  1533.               Select Case XMod8
  1534.                 Case 2
  1535.                   SingleTriangle(0).X = Triangle(1, 0).X
  1536.                   SingleTriangle(0).Y = Triangle(1, 0).Y
  1537.                   SingleTriangle(1).X = Triangle(1, 1).X
  1538.                   SingleTriangle(1).Y = Triangle(1, 1).Y
  1539.                   SingleTriangle(2).X = Triangle(1, 2).X
  1540.                   SingleTriangle(2).Y = Triangle(1, 2).Y
  1541.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, False, TriangleSENWColor)
  1542.                 Case 3
  1543.                   If ComputerPage(Y, X) = 0 Then
  1544.                     SingleRectangle(0).X = Rectangle(2, 0).X
  1545.                     SingleRectangle(0).Y = Rectangle(2, 0).Y
  1546.                     SingleRectangle(1).X = Rectangle(2, 1).X
  1547.                     SingleRectangle(1).Y = Rectangle(2, 1).Y
  1548.                     SingleRectangle(2).X = Rectangle(2, 2).X
  1549.                     SingleRectangle(2).Y = Rectangle(2, 2).Y
  1550.                     SingleRectangle(3).X = Rectangle(2, 3).X
  1551.                     SingleRectangle(3).Y = Rectangle(2, 3).Y
  1552.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleWEColor)
  1553.                   End If
  1554.                 Case 4
  1555.                   SingleTriangle(0).X = Triangle(2, 0).X
  1556.                   SingleTriangle(0).Y = Triangle(2, 0).Y
  1557.                   SingleTriangle(1).X = Triangle(2, 1).X
  1558.                   SingleTriangle(1).Y = Triangle(2, 1).Y
  1559.                   SingleTriangle(2).X = Triangle(2, 2).X
  1560.                   SingleTriangle(2).Y = Triangle(2, 2).Y
  1561.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, False, TriangleSWNEColor)
  1562.                 Case Else
  1563.               End Select
  1564.               XMod8 = XMod8 + 1
  1565.               If XMod8 >= 8 Then
  1566.                 XMod8 = 0
  1567.                 For ObjectNum = 1 To 2
  1568.                   For VertexNum = 0 To 2
  1569.                     Triangle(ObjectNum, VertexNum).X = Triangle(ObjectNum, VertexNum).X + 3#
  1570.                   Next VertexNum
  1571.                 Next ObjectNum
  1572.                 For VertexNum = 0 To 3
  1573.                   Rectangle(2, VertexNum).X = Rectangle(2, VertexNum).X + 3#
  1574.                 Next VertexNum
  1575.               End If
  1576.             Next X
  1577.           Case 1
  1578.             XMod8 = 0
  1579.             For ObjectNum = 1 To 3 Step 2
  1580.               For VertexNum = 0 To 3
  1581.                 Rectangle(ObjectNum, VertexNum).X = BaseRectangle(ObjectNum, VertexNum).X
  1582.                 Rectangle(ObjectNum, VertexNum).Y = BaseRectangle(ObjectNum, VertexNum).Y + YOffset
  1583.               Next VertexNum
  1584.             Next ObjectNum
  1585.             For X = 0 To MaxX
  1586.               Select Case XMod8
  1587.                 Case 1
  1588.                   If ComputerPage(Y, X) = 0 Then
  1589.                     SingleRectangle(0).X = Rectangle(1, 0).X
  1590.                     SingleRectangle(0).Y = Rectangle(1, 0).Y
  1591.                     SingleRectangle(1).X = Rectangle(1, 1).X
  1592.                     SingleRectangle(1).Y = Rectangle(1, 1).Y
  1593.                     SingleRectangle(2).X = Rectangle(1, 2).X
  1594.                     SingleRectangle(2).Y = Rectangle(1, 2).Y
  1595.                     SingleRectangle(3).X = Rectangle(1, 3).X
  1596.                     SingleRectangle(3).Y = Rectangle(1, 3).Y
  1597.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSWNEColor)
  1598.                   End If
  1599.                 Case 5
  1600.                   If ComputerPage(Y, X) = 0 Then
  1601.                     SingleRectangle(0).X = Rectangle(3, 0).X
  1602.                     SingleRectangle(0).Y = Rectangle(3, 0).Y
  1603.                     SingleRectangle(1).X = Rectangle(3, 1).X
  1604.                     SingleRectangle(1).Y = Rectangle(3, 1).Y
  1605.                     SingleRectangle(2).X = Rectangle(3, 2).X
  1606.                     SingleRectangle(2).Y = Rectangle(3, 2).Y
  1607.                     SingleRectangle(3).X = Rectangle(3, 3).X
  1608.                     SingleRectangle(3).Y = Rectangle(3, 3).Y
  1609.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSENWColor)
  1610.                   End If
  1611.                 Case Else
  1612.               End Select
  1613.               XMod8 = XMod8 + 1
  1614.               If XMod8 >= 8 Then
  1615.                 XMod8 = 0
  1616.                 For ObjectNum = 1 To 3 Step 2
  1617.                   For VertexNum = 0 To 3
  1618.                     Rectangle(ObjectNum, VertexNum).X = Rectangle(ObjectNum, VertexNum).X + 3#
  1619.                   Next VertexNum
  1620.                 Next ObjectNum
  1621.               End If
  1622.             Next X
  1623.           Case 2
  1624.             XMod8 = 0
  1625.             For ObjectNum = 0 To 3 Step 3
  1626.               For VertexNum = 0 To 2
  1627.                 Triangle(ObjectNum, VertexNum).X = BaseTriangle(ObjectNum, VertexNum).X
  1628.                 Triangle(ObjectNum, VertexNum).Y = BaseTriangle(ObjectNum, VertexNum).Y + YOffset
  1629.               Next VertexNum
  1630.             Next ObjectNum
  1631.             For VertexNum = 0 To 3
  1632.               Rectangle(4, VertexNum).X = BaseRectangle(4, VertexNum).X
  1633.               Rectangle(4, VertexNum).Y = BaseRectangle(4, VertexNum).Y + YOffset
  1634.             Next VertexNum
  1635.             For X = 0 To MaxX
  1636.               Select Case XMod8
  1637.                 Case 0
  1638.                   SingleTriangle(0).X = Triangle(0, 0).X
  1639.                   SingleTriangle(0).Y = Triangle(0, 0).Y
  1640.                   SingleTriangle(1).X = Triangle(0, 1).X
  1641.                   SingleTriangle(1).Y = Triangle(0, 1).Y
  1642.                   SingleTriangle(2).X = Triangle(0, 2).X
  1643.                   SingleTriangle(2).Y = Triangle(0, 2).Y
  1644.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, True, TriangleSSWNNEColor)
  1645.                 Case 6
  1646.                   SingleTriangle(0).X = Triangle(3, 0).X
  1647.                   SingleTriangle(0).Y = Triangle(3, 0).Y
  1648.                   SingleTriangle(1).X = Triangle(3, 1).X
  1649.                   SingleTriangle(1).Y = Triangle(3, 1).Y
  1650.                   SingleTriangle(2).X = Triangle(3, 2).X
  1651.                   SingleTriangle(2).Y = Triangle(3, 2).Y
  1652.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, True, TriangleSSENNWColor)
  1653.                 Case Else
  1654.               End Select
  1655.               XMod8 = XMod8 + 1
  1656.               If XMod8 >= 8 Then
  1657.                 XMod8 = 0
  1658.                 For ObjectNum = 0 To 3 Step 3
  1659.                   For VertexNum = 0 To 2
  1660.                     Triangle(ObjectNum, VertexNum).X = Triangle(ObjectNum, VertexNum).X + 3#
  1661.                   Next VertexNum
  1662.                 Next ObjectNum
  1663.                 For VertexNum = 0 To 3
  1664.                   Rectangle(4, VertexNum).X = Rectangle(4, VertexNum).X + 3#
  1665.                 Next VertexNum
  1666.               End If
  1667.             Next X
  1668.             XMod8 = 0
  1669.             For ObjectNum = 0 To 3 Step 3
  1670.               For VertexNum = 0 To 2
  1671.                 Triangle(ObjectNum, VertexNum).X = BaseTriangle(ObjectNum, VertexNum).X
  1672.                 Triangle(ObjectNum, VertexNum).Y = BaseTriangle(ObjectNum, VertexNum).Y + YOffset
  1673.               Next VertexNum
  1674.             Next ObjectNum
  1675.             For VertexNum = 0 To 3
  1676.               Rectangle(4, VertexNum).X = BaseRectangle(4, VertexNum).X
  1677.               Rectangle(4, VertexNum).Y = BaseRectangle(4, VertexNum).Y + YOffset
  1678.             Next VertexNum
  1679.             For X = 0 To MaxX
  1680.               Select Case XMod8
  1681.                 Case 0
  1682.                   SingleTriangle(0).X = Triangle(0, 0).X
  1683.                   SingleTriangle(0).Y = Triangle(0, 0).Y
  1684.                   SingleTriangle(1).X = Triangle(0, 1).X
  1685.                   SingleTriangle(1).Y = Triangle(0, 1).Y
  1686.                   SingleTriangle(2).X = Triangle(0, 2).X
  1687.                   SingleTriangle(2).Y = Triangle(0, 2).Y
  1688.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, False, TriangleSWNEColor)
  1689.                 Case 6
  1690.                   SingleTriangle(0).X = Triangle(3, 0).X
  1691.                   SingleTriangle(0).Y = Triangle(3, 0).Y
  1692.                   SingleTriangle(1).X = Triangle(3, 1).X
  1693.                   SingleTriangle(1).Y = Triangle(3, 1).Y
  1694.                   SingleTriangle(2).X = Triangle(3, 2).X
  1695.                   SingleTriangle(2).Y = Triangle(3, 2).Y
  1696.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, False, TriangleSENWColor)
  1697.                 Case 7
  1698.                   If ComputerPage(Y, X) = 0 Then
  1699.                     SingleRectangle(0).X = Rectangle(4, 0).X
  1700.                     SingleRectangle(0).Y = Rectangle(4, 0).Y
  1701.                     SingleRectangle(1).X = Rectangle(4, 1).X
  1702.                     SingleRectangle(1).Y = Rectangle(4, 1).Y
  1703.                     SingleRectangle(2).X = Rectangle(4, 2).X
  1704.                     SingleRectangle(2).Y = Rectangle(4, 2).Y
  1705.                     SingleRectangle(3).X = Rectangle(4, 3).X
  1706.                     SingleRectangle(3).Y = Rectangle(4, 3).Y
  1707.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleWEColor)
  1708.                   End If
  1709.                 Case Else
  1710.               End Select
  1711.               XMod8 = XMod8 + 1
  1712.               If XMod8 >= 8 Then
  1713.                 XMod8 = 0
  1714.                 For ObjectNum = 0 To 3 Step 3
  1715.                   For VertexNum = 0 To 2
  1716.                     Triangle(ObjectNum, VertexNum).X = Triangle(ObjectNum, VertexNum).X + 3#
  1717.                   Next VertexNum
  1718.                 Next ObjectNum
  1719.                 For VertexNum = 0 To 3
  1720.                   Rectangle(4, VertexNum).X = Rectangle(4, VertexNum).X + 3#
  1721.                 Next VertexNum
  1722.               End If
  1723.             Next X
  1724.           Case Else
  1725.             XMod8 = 0
  1726.             For ObjectNum = 0 To 5 Step 5
  1727.               For VertexNum = 0 To 3
  1728.                 Rectangle(ObjectNum, VertexNum).X = BaseRectangle(ObjectNum, VertexNum).X
  1729.                 Rectangle(ObjectNum, VertexNum).Y = BaseRectangle(ObjectNum, VertexNum).Y + YOffset
  1730.               Next VertexNum
  1731.             Next ObjectNum
  1732.             For X = 0 To MaxX
  1733.               Select Case XMod8
  1734.                 Case 1
  1735.                   If ComputerPage(Y, X) = 0 Then
  1736.                     SingleRectangle(0).X = Rectangle(0, 0).X
  1737.                     SingleRectangle(0).Y = Rectangle(0, 0).Y
  1738.                     SingleRectangle(1).X = Rectangle(0, 1).X
  1739.                     SingleRectangle(1).Y = Rectangle(0, 1).Y
  1740.                     SingleRectangle(2).X = Rectangle(0, 2).X
  1741.                     SingleRectangle(2).Y = Rectangle(0, 2).Y
  1742.                     SingleRectangle(3).X = Rectangle(0, 3).X
  1743.                     SingleRectangle(3).Y = Rectangle(0, 3).Y
  1744.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSENWColor)
  1745.                   End If
  1746.                 Case 5
  1747.                   If ComputerPage(Y, X) = 0 Then
  1748.                     SingleRectangle(0).X = Rectangle(5, 0).X
  1749.                     SingleRectangle(0).Y = Rectangle(5, 0).Y
  1750.                     SingleRectangle(1).X = Rectangle(5, 1).X
  1751.                     SingleRectangle(1).Y = Rectangle(5, 1).Y
  1752.                     SingleRectangle(2).X = Rectangle(5, 2).X
  1753.                     SingleRectangle(2).Y = Rectangle(5, 2).Y
  1754.                     SingleRectangle(3).X = Rectangle(5, 3).X
  1755.                     SingleRectangle(3).Y = Rectangle(5, 3).Y
  1756.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSWNEColor)
  1757.                   End If
  1758.                 Case Else
  1759.               End Select
  1760.               XMod8 = XMod8 + 1
  1761.               If XMod8 >= 8 Then
  1762.                 XMod8 = 0
  1763.                 For ObjectNum = 0 To 5 Step 5
  1764.                   For VertexNum = 0 To 3
  1765.                     Rectangle(ObjectNum, VertexNum).X = Rectangle(ObjectNum, VertexNum).X + 3#
  1766.                   Next VertexNum
  1767.                 Next ObjectNum
  1768.               End If
  1769.             Next X
  1770.         End Select
  1771.         YMod4 = YMod4 + 1
  1772.         If YMod4 >= 4 Then
  1773.           YMod4 = 0
  1774.           YOffset = YOffset + Sqrt3
  1775.         End If
  1776.         Y = Y + 1
  1777.       Else
  1778.         State = 5
  1779.       End If
  1780.       If UsePalette Then
  1781.         NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1782.       End If
  1783.       DoEvents
  1784.       If State < 5 Then
  1785.         Timer1.Enabled = True
  1786.       Else
  1787.         If State = 5 Then
  1788.           AlreadyPainting = False
  1789.           Call HexDisplayUserMoves(MaxX, MaxY, UserPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1790.           If SolutionDisplayed Then
  1791.             Call HexDisplaySolution(MaxY, ComputerPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1792.             Text1.Text = ""
  1793.           Else
  1794.             If UserHasSolved Then
  1795.               Text1.Text = "Congratulations!"
  1796.             Else
  1797.               Text1.Text = "Use Home, Up Arrow, PgUp, End, Down Arrow, and PgDn to solve."
  1798.             End If
  1799.           End If
  1800.           mnuActionItem(1).Enabled = True
  1801.           mnuActionItem(2).Enabled = True
  1802.         End If
  1803.       End If
  1804.     Case Else
  1805.       DoEvents
  1806.   End Select
  1807. End Sub
  1808. Private Sub SqrDisplaySolution(MaxY As Integer, Page() As Byte, XMax As Double, XOffset As Double, YMax As Double, CosTilt As Double, SinTilt As Double, PixelsPerX As Double, PixelsPerZ As Double, RelDistOfUserFromScreen As Double)
  1809.   Dim DeltaIndex As Byte
  1810.   Dim OldPaletteHandle As Long
  1811.   Dim PathFound As Integer
  1812.   Dim TemDouble As Double
  1813.   Dim X As Integer
  1814.   Dim XNext As Integer
  1815.   Dim XPrevious As Integer
  1816.   Dim XRelative As Double
  1817.   Dim XRelativeNext As Double
  1818.   Dim Y As Integer
  1819.   Dim YNext As Integer
  1820.   Dim YPrevious As Integer
  1821.   Dim YRelative As Double
  1822.   Dim YRelativeNext As Double
  1823.   If UsePalette Then
  1824.     OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1825.     NumRealized = RealizePalette(frm3DMaze.hDC)
  1826.   End If
  1827.   XRelative = (RelativeWidthOfWall + 1#) / 2#
  1828.   YRelative = (RelativeWidthOfWall + 1#) / 2#
  1829.   CurrentColor = SolutionColor
  1830.   Call DrawLine(XRelative, RelativeWidthOfWall / 2#, XRelative, YRelative, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1831.   XPrevious = 1
  1832.   YPrevious = -1
  1833.   X = 1
  1834.   Y = 1
  1835.     PathFound = False
  1836.     DeltaIndex = 0
  1837.     Do While (Not PathFound)
  1838.       XNext = X + SqrDeltaX(DeltaIndex, 0)
  1839.       YNext = Y + SqrDeltaY(DeltaIndex, 0)
  1840.       If Page(YNext, XNext) = 1 Then
  1841.         XNext = XNext + SqrDeltaX(DeltaIndex, 0)
  1842.         YNext = YNext + SqrDeltaY(DeltaIndex, 0)
  1843.         If (XNext <> XPrevious) Or (YNext <> YPrevious) Then
  1844.           PathFound = True
  1845.         Else
  1846.           DeltaIndex = DeltaIndex + 1
  1847.         End If
  1848.       Else
  1849.         DeltaIndex = DeltaIndex + 1
  1850.       End If
  1851.     Loop
  1852.     If YNext < MaxY Then
  1853.       TemDouble = SqrDeltaX(DeltaIndex, 0)
  1854.       XRelativeNext = XRelative + TemDouble
  1855.       TemDouble = SqrDeltaY(DeltaIndex, 0)
  1856.       YRelativeNext = YRelative + TemDouble
  1857.       Call DrawLine(XRelative, YRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1858.     Else
  1859.       Call DrawLine(XRelative, YRelative, XRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1860.     End If
  1861.     XPrevious = X
  1862.     YPrevious = Y
  1863.     X = XNext
  1864.     Y = YNext
  1865.     XRelative = XRelativeNext
  1866.     YRelative = YRelativeNext
  1867.   Loop While YNext < MaxY
  1868.   If UsePalette Then
  1869.     NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1870.   End If
  1871. End Sub
  1872. Private Sub SqrDisplayUserMoves(MaxX As Integer, MaxY As Integer, Page() As Byte, XMax As Double, XOffset As Double, YMax As Double, CosTilt As Double, SinTilt As Double, PixelsPerX As Double, PixelsPerZ As Double, RelDistOfUserFromScreen As Double)
  1873.   Dim DeltaIndex As Byte
  1874.   Dim OldPaletteHandle As Long
  1875.   Dim TemDouble As Double
  1876.   Dim X As Integer
  1877.   Dim XNext As Integer
  1878.   Dim XNextNext As Integer
  1879.   Dim XRelative As Double
  1880.   Dim XRelativeNext As Double
  1881.   Dim Y As Integer
  1882.   Dim YNext As Integer
  1883.   Dim YNextNext As Integer
  1884.   Dim YRelative As Double
  1885.   Dim YRelativeNext As Double
  1886.   If UsePalette Then
  1887.     OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1888.     NumRealized = RealizePalette(frm3DMaze.hDC)
  1889.   End If
  1890.   Y = 1
  1891.   YRelative = (RelativeWidthOfWall + 1#) / 2#
  1892.   Do While (Y < MaxY)
  1893.     X = 1
  1894.     XRelative = (RelativeWidthOfWall + 1#) / 2#
  1895.     Do While (X < MaxX)
  1896.       If ((Page(Y, X) = 1) Or (Page(Y, X) = 3)) Then
  1897.         For DeltaIndex = 0 To 3
  1898.           XNext = X + SqrDeltaX(DeltaIndex, 0)
  1899.           YNext = Y + SqrDeltaY(DeltaIndex, 0)
  1900.           If Page(YNext, XNext) <> 0 Then
  1901.             If YNext = 0 Then
  1902.               CurrentColor = AdvanceColor
  1903.               Call DrawLine(XRelative, RelativeWidthOfWall / 2#, XRelative, YRelative, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1904.             Else
  1905.               If YNext = MaxY Then
  1906.                 If UserHasSolved Then
  1907.                   CurrentColor = AdvanceColor
  1908.                   Call DrawLine(XRelative, YRelative, XRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1909.                 End If
  1910.               Else
  1911.                 XNextNext = XNext + SqrDeltaX(DeltaIndex, 0)
  1912.                 If XNextNext > 0 Then
  1913.                   If XNextNext < MaxX Then
  1914.                     YNextNext = YNext + SqrDeltaY(DeltaIndex, 0)
  1915.                     If YNextNext > 0 Then
  1916.                       If YNextNext < MaxY Then
  1917.                         If ((Page(YNextNext, XNextNext) = 1) Or (Page(YNextNext, XNextNext) = 3)) Then
  1918.                           If Page(Y, X) = Page(YNextNext, XNextNext) Then
  1919.                             If Page(Y, X) = 1 Then
  1920.                               CurrentColor = AdvanceColor
  1921.                             Else
  1922.                               CurrentColor = BackoutColor
  1923.                             End If
  1924.                           Else
  1925.                             CurrentColor = BackoutColor
  1926.                           End If
  1927.                           TemDouble = SqrDeltaX(DeltaIndex, 0)
  1928.                           XRelativeNext = XRelative + TemDouble / 2#
  1929.                           TemDouble = SqrDeltaY(DeltaIndex, 0)
  1930.                           YRelativeNext = YRelative + TemDouble / 2#
  1931.                           Call DrawLine(XRelative, YRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1932.                         End If
  1933.                        End If
  1934.                     End If
  1935.                   End If
  1936.                 End If
  1937.               End If
  1938.             End If
  1939.           End If
  1940.         Next DeltaIndex
  1941.       End If
  1942.       XRelative = XRelative + 1#
  1943.       X = X + 2
  1944.     Loop
  1945.     YRelative = YRelative + 1#
  1946.     Y = Y + 2
  1947.   Loop
  1948.   If UsePalette Then
  1949.     NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1950.   End If
  1951. End Sub
  1952. Private Sub SqrSolveMaze(Stack() As StackRec, Page() As Byte, NumRoomsInSolution As Integer, Adjacency As Integer, MaxX As Integer, MaxY As Integer)
  1953.   Dim DeltaIndex As Byte
  1954.   Dim PassageFound As Integer
  1955.   Dim StackHead As Integer
  1956.   Dim X As Integer
  1957.   Dim XNext As Integer
  1958.   Dim Y As Integer
  1959.   Dim YNext As Integer
  1960.   NumRoomsInSolution = 1
  1961.   Adjacency = 0
  1962.   X = 1
  1963.   Y = 1
  1964.   StackHead = -1
  1965.   Page(Y, X) = 1
  1966.     DeltaIndex = 0
  1967.     PassageFound = False
  1968.     Do
  1969.       Do While ((DeltaIndex < 4) And (Not PassageFound))
  1970.         XNext = X + SqrDeltaX(DeltaIndex, 0)
  1971.         YNext = Y + SqrDeltaY(DeltaIndex, 0)
  1972.         If Page(YNext, XNext) = 2 Then
  1973.           PassageFound = True
  1974.         Else
  1975.           DeltaIndex = DeltaIndex + 1
  1976.         End If
  1977.       Loop
  1978.       If Not PassageFound Then
  1979.         DeltaIndex = Stack(StackHead).Index1
  1980.         Page(Y, X) = 2
  1981.         X = X - SqrDeltaX(DeltaIndex, 0)
  1982.         Y = Y - SqrDeltaY(DeltaIndex, 0)
  1983.         Page(Y, X) = 2
  1984.         X = X - SqrDeltaX(DeltaIndex, 0)
  1985.         Y = Y - SqrDeltaY(DeltaIndex, 0)
  1986.         StackHead = StackHead - 1
  1987.         DeltaIndex = DeltaIndex + 1
  1988.       End If
  1989.     Loop While Not PassageFound
  1990.     Page(YNext, XNext) = 1
  1991.     XNext = XNext + SqrDeltaX(DeltaIndex, 0)
  1992.     YNext = YNext + SqrDeltaY(DeltaIndex, 0)
  1993.     If YNext <= MaxY Then
  1994.       StackHead = StackHead + 1
  1995.       Stack(StackHead).Index1 = DeltaIndex
  1996.       Page(YNext, XNext) = 1
  1997.       X = XNext
  1998.       Y = YNext
  1999.     End If
  2000.   Loop While YNext < MaxY
  2001.   X = MaxX - 1
  2002.   Y = MaxY - 1
  2003.   Adjacency = 0
  2004.   Do While (StackHead >= 0)
  2005.     For DeltaIndex = 0 To 3
  2006.       XNext = X + SqrDeltaX(DeltaIndex, 0)
  2007.       YNext = Y + SqrDeltaY(DeltaIndex, 0)
  2008.       If Page(YNext, XNext) <> 1 Then
  2009.         If Page(YNext, XNext) = 0 Then
  2010.           XNext = XNext + SqrDeltaX(DeltaIndex, 0)
  2011.           YNext = YNext + SqrDeltaY(DeltaIndex, 0)
  2012.           If XNext < 0 Then
  2013.             Adjacency = Adjacency + 1
  2014.           Else
  2015.             If XNext > MaxX Then
  2016.               Adjacency = Adjacency + 1
  2017.             Else
  2018.               If YNext < 0 Then
  2019.                 Adjacency = Adjacency + 1
  2020.               Else
  2021.                 If YNext > MaxY Then
  2022.                   Adjacency = Adjacency + 1
  2023.                 Else
  2024.                   If Page(YNext, XNext) = 1 Then
  2025.                     Adjacency = Adjacency + 1
  2026.                   End If
  2027.                 End If
  2028.               End If
  2029.             End If
  2030.           End If
  2031.         End If
  2032.       End If
  2033.     Next DeltaIndex
  2034.     X = X - 2 * SqrDeltaX(Stack(StackHead).Index1, 0)
  2035.     Y = Y - 2 * SqrDeltaY(Stack(StackHead).Index1, 0)
  2036.     StackHead = StackHead - 1
  2037.     NumRoomsInSolution = NumRoomsInSolution + 1
  2038.   Loop
  2039.   For DeltaIndex = 0 To 3
  2040.     XNext = X + SqrDeltaX(DeltaIndex, 0)
  2041.     YNext = X + SqrDeltaY(DeltaIndex, 0)
  2042.     If Page(YNext, XNext) <> 2 Then
  2043.       If Page(YNext, XNext) = 0 Then
  2044.         XNext = XNext + SqrDeltaX(DeltaIndex, 0)
  2045.         YNext = YNext + SqrDeltaY(DeltaIndex, 0)
  2046.         If XNext < 0 Then
  2047.           Adjacency = Adjacency + 1
  2048.         Else
  2049.           If XNext > MaxX Then
  2050.             Adjacency = Adjacency + 1
  2051.           Else
  2052.             If YNext < 0 Then
  2053.               Adjacency = Adjacency + 1
  2054.             Else
  2055.               If YNext > MaxY Then
  2056.                 Adjacency = Adjacency + 1
  2057.               Else
  2058.                 If Page(YNext, XNext) = 1 Then
  2059.                   Adjacency = Adjacency + 1
  2060.                 End If
  2061.               End If
  2062.             End If
  2063.           End If
  2064.         End If
  2065.       End If
  2066.     End If
  2067.   Next DeltaIndex
  2068. End Sub
  2069. Private Sub SqrGenerateMaze(Page() As Byte, MaxX As Integer, MaxY As Integer, Stack() As StackRec, NumColumns As Integer, NumRows As Integer, Seed() As Byte)
  2070.   Dim DeltaIndex1 As Byte
  2071.   Dim DeltaIndex2 As Integer
  2072.   Dim Digit As Integer
  2073.   Dim DigitNum As Byte
  2074.   Dim PassageFound As Integer
  2075.   Dim RN(7) As Integer
  2076.   Dim RNIndex1 As Integer
  2077.   Dim RNIndex2 As Integer
  2078.   Dim SearchComplete As Integer
  2079.   Dim StackHead As Integer
  2080.   Dim Sum As Integer
  2081.   Dim TemInt As Integer
  2082.   Dim X As Integer
  2083.   Dim XNext As Integer
  2084.   Dim Y As Integer
  2085.   Dim YNext As Integer
  2086.   RN(0) = Seed(0) + 1
  2087.   RN(1) = Seed(1) + 1
  2088.   RN(2) = Seed(2) + 1
  2089.   RN(3) = Seed(3) + 1
  2090.   RN(4) = Seed(4) + 1
  2091.   RN(5) = Seed(5) + 1
  2092.   RN(6) = Seed(6) + 1
  2093.   RN(7) = Seed(7) + 1
  2094.   For Y = 0 To MaxY
  2095.     For X = 0 To MaxX
  2096.       Page(Y, X) = 0
  2097.     Next X
  2098.   Next Y
  2099.   Sum = 0
  2100.   For DigitNum = 1 To 3
  2101.     Digit = RN(0)
  2102.     RNIndex1 = 0
  2103.     RNIndex2 = 1
  2104.     Do While (RNIndex2 < 8)
  2105.       TemInt = RN(RNIndex2)
  2106.       RN(RNIndex1) = TemInt
  2107.       Digit = Digit + TemInt
  2108.       If Digit >= 29 Then Digit = Digit - 29
  2109.       RNIndex1 = RNIndex2
  2110.       RNIndex2 = RNIndex2 + 1
  2111.     Loop
  2112.     RN(7) = Digit
  2113.     Sum = 29 * Sum + Digit
  2114.   Next DigitNum
  2115.   X = 2 * (Sum Mod NumColumns) + 1
  2116.   Sum = 0
  2117.   For DigitNum = 1 To 3
  2118.     Digit = RN(0)
  2119.     RNIndex1 = 0
  2120.     RNIndex2 = 1
  2121.     Do While (RNIndex2 < 8)
  2122.       TemInt = RN(RNIndex2)
  2123.       RN(RNIndex1) = TemInt
  2124.       Digit = Digit + TemInt
  2125.       If Digit >= 29 Then Digit = Digit - 29
  2126.       RNIndex1 = RNIndex2
  2127.       RNIndex2 = RNIndex2 + 1
  2128.     Loop
  2129.     RN(7) = Digit
  2130.     Sum = 29 * Sum + Digit
  2131.   Next DigitNum
  2132.   Y = 2 * (Sum Mod NumRows) + 1
  2133.   Page(Y, X) = 2
  2134.   StackHead = -1
  2135.     DeltaIndex1 = 0
  2136.     Do
  2137.       DeltaIndex2 = RN(0)
  2138.       RNIndex1 = 0
  2139.       RNIndex2 = 1
  2140.       Do While (RNIndex2 < 8)
  2141.         TemInt = RN(RNIndex2)
  2142.         RN(RNIndex1) = TemInt
  2143.         DeltaIndex2 = DeltaIndex2 + TemInt
  2144.         If DeltaIndex2 >= 29 Then DeltaIndex2 = DeltaIndex2 - 29
  2145.         RNIndex1 = RNIndex2
  2146.         RNIndex2 = RNIndex2 + 1
  2147.       Loop
  2148.       RN(7) = DeltaIndex2
  2149.     Loop While DeltaIndex2 >= 24
  2150.     PassageFound = False
  2151.     SearchComplete = False
  2152.     Do While (Not SearchComplete)
  2153.       Do While ((DeltaIndex1 < 4) And (Not PassageFound))
  2154.         XNext = X + 2 * SqrDeltaX(DeltaIndex1, DeltaIndex2)
  2155.         If XNext <= 0 Then
  2156.           DeltaIndex1 = DeltaIndex1 + 1
  2157.         Else
  2158.           If XNext > MaxX Then
  2159.             DeltaIndex1 = DeltaIndex1 + 1
  2160.           Else
  2161.             YNext = Y + 2 * SqrDeltaY(DeltaIndex1, DeltaIndex2)
  2162.             If YNext <= 0 Then
  2163.               DeltaIndex1 = DeltaIndex1 + 1
  2164.             Else
  2165.               If YNext > MaxY Then
  2166.                 DeltaIndex1 = DeltaIndex1 + 1
  2167.               Else
  2168.                 If Page(YNext, XNext) = 0 Then
  2169.                   PassageFound = True
  2170.                 Else
  2171.                   DeltaIndex1 = DeltaIndex1 + 1
  2172.                 End If
  2173.               End If
  2174.             End If
  2175.           End If
  2176.         End If
  2177.       Loop
  2178.       If Not PassageFound Then
  2179.         If StackHead >= 0 Then
  2180.           DeltaIndex1 = Stack(StackHead).Index1
  2181.           DeltaIndex2 = Stack(StackHead).Index2
  2182.           X = X - 2 * SqrDeltaX(DeltaIndex1, DeltaIndex2)
  2183.           Y = Y - 2 * SqrDeltaY(DeltaIndex1, DeltaIndex2)
  2184.           StackHead = StackHead - 1
  2185.           DeltaIndex1 = DeltaIndex1 + 1
  2186.         End If
  2187.       End If
  2188.       If ((PassageFound) Or ((StackHead = -1) And (DeltaIndex1 >= 4))) Then
  2189.         SearchComplete = True
  2190.       Else
  2191.         SearchComplete = False
  2192.       End If
  2193.     Loop
  2194.     If PassageFound Then
  2195.       StackHead = StackHead + 1
  2196.       Stack(StackHead).Index1 = DeltaIndex1
  2197.       Stack(StackHead).Index2 = DeltaIndex2
  2198.       Page(YNext, XNext) = 2
  2199.       Page((Y + YNext) \ 2, (X + XNext) \ 2) = 2
  2200.       X = XNext
  2201.       Y = YNext
  2202.     End If
  2203.   Loop While StackHead <> -1
  2204.   Page(0, 1) = 1
  2205.   Page(MaxY, MaxX - 1) = 2
  2206. End Sub
  2207. Private Sub SqrSelectMaze(Seed As String, Page() As Byte, MaxX As Integer, MaxY As Integer, Stack() As StackRec, NumRoomsInMaze As Integer, NumColumns As Integer, NumRows As Integer, SecondsForMazeSelection As Double)
  2208.   Dim Adjacency As Integer
  2209.   Dim Counter0 As Byte
  2210.   Dim Counter1 As Byte
  2211.   Dim Counter2 As Byte
  2212.   Dim Counter3 As Byte
  2213.   Dim Counter4 As Byte
  2214.   Dim Counter5 As Byte
  2215.   Dim Counter6 As Byte
  2216.   Dim Counter7 As Byte
  2217.   Dim ElapsedTime As Double
  2218.   Dim MinAdjacency As Integer
  2219.   Dim NumRoomsInSolution As Integer
  2220.   Dim NumRoomsInSolutionAtMin As Integer
  2221.   Dim RN(7) As Integer
  2222.   Dim RNIndex1 As Integer
  2223.   Dim RNIndex2 As Integer
  2224.   Dim SeedByte(7) As Byte
  2225.   Dim SeedByteAtMin(7) As Byte
  2226.   Dim SeedLength As Integer
  2227.   Dim StartTime As Double
  2228.   SeedLength = Len(Seed)
  2229.   If SeedLength > 8 Then SeedLength = 8
  2230.   RNIndex1 = 0
  2231.   For RNIndex2 = 1 To SeedLength
  2232.     RN(RNIndex1) = Asc(Mid$(Seed, RNIndex2, 1)) Mod 10
  2233.     RNIndex1 = RNIndex1 + 1
  2234.   Next RNIndex2
  2235.   RNIndex2 = 7
  2236.   Do While (RNIndex1 > 0)
  2237.     RNIndex1 = RNIndex1 - 1
  2238.     RN(RNIndex2) = RN(RNIndex1)
  2239.     RNIndex2 = RNIndex2 - 1
  2240.   Loop
  2241.   Do While (RNIndex2 >= 0)
  2242.     RN(RNIndex2) = 8
  2243.     RNIndex2 = RNIndex2 - 1
  2244.   Loop
  2245.   Counter0 = RN(0)
  2246.   Counter1 = RN(1)
  2247.   Counter2 = RN(2)
  2248.   Counter3 = RN(3)
  2249.   Counter4 = RN(4)
  2250.   Counter5 = RN(5)
  2251.   Counter6 = RN(6)
  2252.   Counter7 = RN(7)
  2253.   Call Hash(Counter0, Counter1, Counter2, Counter3, Counter4, Counter5, Counter6, Counter7)
  2254.   MinAdjacency = 2 * NumRoomsInMaze + 1
  2255.   NumRoomsInSolutionAtMin = 0
  2256.   SeedByteAtMin(0) = Counter0
  2257.   SeedByteAtMin(1) = Counter1
  2258.   SeedByteAtMin(2) = Counter2
  2259.   SeedByteAtMin(3) = Counter3
  2260.   SeedByteAtMin(4) = Counter4
  2261.   SeedByteAtMin(5) = Counter5
  2262.   SeedByteAtMin(6) = Counter6
  2263.   SeedByteAtMin(7) = Counter7
  2264.   StartTime = Timer
  2265.     SeedByte(0) = Counter0
  2266.     SeedByte(1) = Counter1
  2267.     SeedByte(2) = Counter2
  2268.     SeedByte(3) = Counter3
  2269.     SeedByte(4) = Counter4
  2270.     SeedByte(5) = Counter5
  2271.     SeedByte(6) = Counter6
  2272.     SeedByte(7) = Counter7
  2273.     Call SqrGenerateMaze(Page(), MaxX, MaxY, Stack(), NumColumns, NumRows, SeedByte())
  2274.     Call SqrSolveMaze(Stack(), Page(), NumRoomsInSolution, Adjacency, MaxX, MaxY)
  2275.     If 3 * NumRoomsInSolution >= NumRoomsInMaze Then
  2276.       If Adjacency < MinAdjacency Then
  2277.         MinAdjacency = Adjacency
  2278.         NumRoomsInSolutionAtMin = NumRoomsInSolution
  2279.         SeedByteAtMin(0) = SeedByte(0)
  2280.         SeedByteAtMin(1) = SeedByte(1)
  2281.         SeedByteAtMin(2) = SeedByte(2)
  2282.         SeedByteAtMin(3) = SeedByte(3)
  2283.         SeedByteAtMin(4) = SeedByte(4)
  2284.         SeedByteAtMin(5) = SeedByte(5)
  2285.         SeedByteAtMin(6) = SeedByte(6)
  2286.         SeedByteAtMin(7) = SeedByte(7)
  2287.       Else
  2288.         If Adjacency = MinAdjacency Then
  2289.           If NumRoomsInSolution > NumRoomsInSolutionAtMin Then
  2290.             NumRoomsInSolutionAtMin = NumRoomsInSolution
  2291.             SeedByteAtMin(0) = SeedByte(0)
  2292.             SeedByteAtMin(1) = SeedByte(1)
  2293.             SeedByteAtMin(2) = SeedByte(2)
  2294.             SeedByteAtMin(3) = SeedByte(3)
  2295.             SeedByteAtMin(4) = SeedByte(4)
  2296.             SeedByteAtMin(5) = SeedByte(5)
  2297.             SeedByteAtMin(6) = SeedByte(6)
  2298.             SeedByteAtMin(7) = SeedByte(7)
  2299.           End If
  2300.         End If
  2301.       End If
  2302.     End If
  2303.     Call Increment(Counter0, Counter1, Counter2, Counter3, Counter4, Counter5, Counter6, Counter7)
  2304.     ElapsedTime = Timer - StartTime
  2305.   Loop While ((ElapsedTime >= 0#) And (ElapsedTime < SecondsForMazeSelection))
  2306.   Call SqrGenerateMaze(Page(), MaxX, MaxY, Stack(), NumColumns, NumRows, SeedByteAtMin())
  2307.   Call SqrSolveMaze(Stack(), Page(), NumRoomsInSolution, Adjacency, MaxX, MaxY)
  2308. End Sub
  2309. Private Sub SqrOutputMaze()
  2310.   Dim ObjectNum As Byte
  2311.   Dim Radians As Double
  2312.   Dim RadiansPerDegree As Double
  2313.   Dim SingleRectangle(3) As VertexRec
  2314.   Dim SingleTriangle(2) As VertexRec
  2315.   Dim TemDouble1 As Double
  2316.   Dim TemDouble2 As Double
  2317.   Dim TemDouble3 As Double
  2318.   Dim TemDouble4 As Double
  2319.   Dim Triangle(3, 2) As VertexRec
  2320.   Dim VertexNum As Byte
  2321.   Dim XMod8 As Byte
  2322.   Dim X0 As Double
  2323.   Dim X1 As Double
  2324.   Dim X2 As Double
  2325.   Dim X3 As Double
  2326.   Dim Y0 As Double
  2327.   Dim Y1 As Double
  2328.   Dim Y2 As Double
  2329.   Dim Y3 As Double
  2330.   Select Case State
  2331.     Case 0
  2332.       Text1.Text = ""
  2333.       ScaleMode = 1
  2334.       If (Resize) Then
  2335.         TemDouble1 = ScaleWidth - VScroll1.Width
  2336.         TemDouble2 = MinWallLengthInInches
  2337.         TemDouble2 = 1440# * TemDouble2
  2338.         TemDouble3 = RelativeWidthOfWall
  2339.         NumColumns = Int(TemDouble1 / TemDouble2 - TemDouble3)
  2340.         If NumColumns < 2 Then NumColumns = 2
  2341.         TemDouble1 = ScaleHeight - Text1.Height
  2342.         TemDouble2 = ScaleWidth - VScroll1.Width
  2343.         ScaleMode = 3
  2344.         TemDouble3 = NumColumns
  2345.         NumRows = Int((TemDouble1 * TemDouble3) / TemDouble2)
  2346.         If NumRows < 2 Then NumRows = 2
  2347.         Tilt = 90 - ScrollValue
  2348.         MaxX = 2 * NumColumns
  2349.         MaxY = 2 * NumRows
  2350.         NumRoomsInMaze = NumRows * NumColumns
  2351.         ReDim ComputerPage(MaxY, MaxX)
  2352.         ReDim UserPage(MaxY, MaxX)
  2353.         ReDim Stack(NumRoomsInMaze)
  2354.         Call SqrSelectMaze(Seed, ComputerPage(), MaxX, MaxY, Stack(), NumRoomsInMaze, NumColumns, NumRows, SecondsForMazeSelection)
  2355.         For UserX = 0 To MaxX
  2356.           For UserY = 0 To MaxY
  2357.             If ComputerPage(UserY, UserX) = 0 Then
  2358.               UserPage(UserY, UserX) = 0
  2359.             Else
  2360.               UserPage(UserY, UserX) = 2
  2361.             End If
  2362.           Next UserY
  2363.         Next UserX
  2364.         UserX = 1
  2365.         UserXRelative = (RelativeWidthOfWall + 1#) / 2#
  2366.         UserY = 1
  2367.         UserYRelative = (RelativeWidthOfWall + 1#) / 2#
  2368.         UserPage(UserY, UserX) = 1
  2369.         Resize = False
  2370.       End If
  2371.       If (Paint) Then
  2372.         ScaleMode = 3
  2373.         Cls
  2374.         RadiansPerDegree = Atn(1#) / 45#
  2375.         Radians = Tilt * RadiansPerDegree
  2376.         SinTilt = Sin(Radians)
  2377.         CosTilt = Cos(Radians)
  2378.         TemDouble1 = NumColumns
  2379.         XMax = TemDouble1 + RelativeWidthOfWall
  2380.         TemDouble1 = ScaleWidth - VScroll1.Width
  2381.         PixelsPerX = (TemDouble1 - 1#) / (XMax * (XMax / (XMax - RelativeHeightOfWall)))
  2382.         XOffset = (XMax / 2#) * (RelativeHeightOfWall / (XMax - RelativeHeightOfWall))
  2383.         TemDouble1 = NumRows
  2384.         YMax = TemDouble1 + RelativeWidthOfWall
  2385.         TemDouble1 = ScaleHeight - Text1.Height
  2386.         PixelsPerZ = (TemDouble1 - 1#) / Sqr(YMax * YMax + RelativeHeightOfWall * RelativeHeightOfWall)
  2387.         If YMax > XMax Then
  2388.           RelDistOfUserFromScreen = YMax
  2389.         Else
  2390.           RelDistOfUserFromScreen = XMax
  2391.         End If
  2392.         Paint = False
  2393.       End If
  2394.       If State = 0 Then
  2395.         State = 1
  2396.         DoEvents
  2397.         If State < 5 Then
  2398.           Timer1.Enabled = True
  2399.         End If
  2400.       End If
  2401.     Case 1
  2402.       BaseRectangle(0, 0).X = 0#
  2403.       BaseRectangle(0, 0).Y = 0#
  2404.       BaseRectangle(0, 1).X = RelativeWidthOfWall
  2405.       BaseRectangle(0, 1).Y = 0#
  2406.       BaseRectangle(0, 2).X = RelativeWidthOfWall
  2407.       BaseRectangle(0, 2).Y = RelativeWidthOfWall
  2408.       BaseRectangle(0, 3).X = 0#
  2409.       BaseRectangle(0, 3).Y = RelativeWidthOfWall
  2410.       BaseRectangle(1, 0).X = RelativeWidthOfWall
  2411.       BaseRectangle(1, 0).Y = 0#
  2412.       BaseRectangle(1, 1).X = 1#
  2413.       BaseRectangle(1, 1).Y = 0#
  2414.       BaseRectangle(1, 2).X = 1#
  2415.       BaseRectangle(1, 2).Y = RelativeWidthOfWall
  2416.       BaseRectangle(1, 3).X = RelativeWidthOfWall
  2417.       BaseRectangle(1, 3).Y = RelativeWidthOfWall
  2418.       BaseRectangle(2, 0).X = RelativeWidthOfWall
  2419.       BaseRectangle(2, 0).Y = RelativeWidthOfWall
  2420.       BaseRectangle(2, 1).X = 1#
  2421.       BaseRectangle(2, 1).Y = RelativeWidthOfWall
  2422.       BaseRectangle(2, 2).X = 1#
  2423.       BaseRectangle(2, 2).Y = 1#
  2424.       BaseRectangle(2, 3).X = RelativeWidthOfWall
  2425.       BaseRectangle(2, 3).Y = 1#
  2426.       BaseRectangle(3, 0).X = 0#
  2427.       BaseRectangle(3, 0).Y = RelativeWidthOfWall
  2428.       BaseRectangle(3, 1).X = RelativeWidthOfWall
  2429.       BaseRectangle(3, 1).Y = RelativeWidthOfWall
  2430.       BaseRectangle(3, 2).X = RelativeWidthOfWall
  2431.       BaseRectangle(3, 2).Y = 1#
  2432.       BaseRectangle(3, 3).X = 0#
  2433.       BaseRectangle(3, 3).Y = 1#
  2434.       Rectangle(0, 0).X = 0#
  2435.       Rectangle(0, 0).Y = 0#
  2436.       Rectangle(0, 1).X = XMax
  2437.       Rectangle(0, 1).Y = 0#
  2438.       Rectangle(0, 2).X = XMax
  2439.       Rectangle(0, 2).Y = YMax
  2440.       Rectangle(0, 3).X = 0#
  2441.       Rectangle(0, 3).Y = YMax
  2442.       If UsePalette Then
  2443.         OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2444.         NumRealized = RealizePalette(frm3DMaze.hDC)
  2445.       End If
  2446.       X0 = Rectangle(0, 0).X
  2447.       Y0 = Rectangle(0, 0).Y
  2448.       X1 = Rectangle(0, 1).X
  2449.       Y1 = Rectangle(0, 1).Y
  2450.       X2 = Rectangle(0, 2).X
  2451.       Y2 = Rectangle(0, 2).Y
  2452.       X3 = Rectangle(0, 3).X
  2453.       Y3 = Rectangle(0, 3).Y
  2454.       Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  2455.       Y = 0
  2456.       YOffset = 0
  2457.       State = 4
  2458.       If UsePalette Then
  2459.         NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2460.       End If
  2461.       DoEvents
  2462.       If State < 5 Then
  2463.         Timer1.Enabled = True
  2464.       End If
  2465.     Case 4
  2466.       If UsePalette Then
  2467.         OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2468.         NumRealized = RealizePalette(frm3DMaze.hDC)
  2469.       End If
  2470.       If Y <= MaxY Then
  2471.         For VertexNum = 0 To 3
  2472.           Rectangle(0, VertexNum).X = BaseRectangle(0, VertexNum).X
  2473.           Rectangle(0, VertexNum).Y = BaseRectangle(0, VertexNum).Y + YOffset
  2474.         Next VertexNum
  2475.         X = 0
  2476.         Do While X <= MaxX
  2477.           If ComputerPage(Y, X) = 0 Then
  2478.             SingleRectangle(0).X = Rectangle(0, 0).X
  2479.             SingleRectangle(0).Y = Rectangle(0, 0).Y
  2480.             SingleRectangle(1).X = Rectangle(0, 1).X
  2481.             SingleRectangle(1).Y = Rectangle(0, 1).Y
  2482.             SingleRectangle(2).X = Rectangle(0, 2).X
  2483.             SingleRectangle(2).Y = Rectangle(0, 2).Y
  2484.             SingleRectangle(3).X = Rectangle(0, 3).X
  2485.             SingleRectangle(3).Y = Rectangle(0, 3).Y
  2486.             Call OutputLeftRight(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen)
  2487.           End If
  2488.           For VertexNum = 0 To 3
  2489.             Rectangle(0, VertexNum).X = Rectangle(0, VertexNum).X + 1
  2490.           Next VertexNum
  2491.           X = X + 2
  2492.         Loop
  2493.         For VertexNum = 0 To 3
  2494.           Rectangle(0, VertexNum).X = BaseRectangle(0, VertexNum).X
  2495.           Rectangle(0, VertexNum).Y = BaseRectangle(0, VertexNum).Y + YOffset
  2496.         Next VertexNum
  2497.         For VertexNum = 0 To 3
  2498.           Rectangle(1, VertexNum).X = BaseRectangle(1, VertexNum).X
  2499.           Rectangle(1, VertexNum).Y = BaseRectangle(1, VertexNum).Y + YOffset
  2500.         Next VertexNum
  2501.         X = 0
  2502.         Do While X <= MaxX
  2503.           If ComputerPage(Y, X) = 0 Then
  2504.             SingleRectangle(0).X = Rectangle(0, 0).X
  2505.             SingleRectangle(0).Y = Rectangle(0, 0).Y
  2506.             SingleRectangle(1).X = Rectangle(0, 1).X
  2507.             SingleRectangle(1).Y = Rectangle(0, 1).Y
  2508.             SingleRectangle(2).X = Rectangle(0, 2).X
  2509.             SingleRectangle(2).Y = Rectangle(0, 2).Y
  2510.             SingleRectangle(3).X = Rectangle(0, 3).X
  2511.             SingleRectangle(3).Y = Rectangle(0, 3).Y
  2512.             Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleWEColor)
  2513.           End If
  2514.           For VertexNum = 0 To 3
  2515.             Rectangle(0, VertexNum).X = Rectangle(0, VertexNum).X + 1
  2516.           Next VertexNum
  2517.           X = X + 1
  2518.           If X <= MaxX Then
  2519.             If ComputerPage(Y, X) = 0 Then
  2520.               SingleRectangle(0).X = Rectangle(1, 0).X
  2521.               SingleRectangle(0).Y = Rectangle(1, 0).Y
  2522.               SingleRectangle(1).X = Rectangle(1, 1).X
  2523.               SingleRectangle(1).Y = Rectangle(1, 1).Y
  2524.               SingleRectangle(2).X = Rectangle(1, 2).X
  2525.               SingleRectangle(2).Y = Rectangle(1, 2).Y
  2526.               SingleRectangle(3).X = Rectangle(1, 3).X
  2527.               SingleRectangle(3).Y = Rectangle(1, 3).Y
  2528.               Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleWEColor)
  2529.             End If
  2530.             For VertexNum = 0 To 3
  2531.               Rectangle(1, VertexNum).X = Rectangle(1, VertexNum).X + 1
  2532.             Next VertexNum
  2533.             X = X + 1
  2534.           End If
  2535.         Loop
  2536.         Y = Y + 1
  2537.         If Y <= MaxY Then
  2538.           For VertexNum = 0 To 3
  2539.             Rectangle(3, VertexNum).X = BaseRectangle(3, VertexNum).X
  2540.             Rectangle(3, VertexNum).Y = BaseRectangle(3, VertexNum).Y + YOffset
  2541.           Next VertexNum
  2542.           X = 0
  2543.           Do While X <= MaxX
  2544.             If ComputerPage(Y, X) = 0 Then
  2545.               SingleRectangle(0).X = Rectangle(3, 0).X
  2546.               SingleRectangle(0).Y = Rectangle(3, 0).Y
  2547.               SingleRectangle(1).X = Rectangle(3, 1).X
  2548.               SingleRectangle(1).Y = Rectangle(3, 1).Y
  2549.               SingleRectangle(2).X = Rectangle(3, 2).X
  2550.               SingleRectangle(2).Y = Rectangle(3, 2).Y
  2551.               SingleRectangle(3).X = Rectangle(3, 3).X
  2552.               SingleRectangle(3).Y = Rectangle(3, 3).Y
  2553.               Call OutputLeftRight(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen)
  2554.             End If
  2555.             For VertexNum = 0 To 3
  2556.               Rectangle(3, VertexNum).X = Rectangle(3, VertexNum).X + 1
  2557.             Next VertexNum
  2558.             X = X + 2
  2559.           Loop
  2560.           For VertexNum = 0 To 3
  2561.             Rectangle(3, VertexNum).X = BaseRectangle(3, VertexNum).X
  2562.             Rectangle(3, VertexNum).Y = BaseRectangle(3, VertexNum).Y + YOffset
  2563.           Next VertexNum
  2564.           X = 0
  2565.           Do While X <= MaxX
  2566.             If ComputerPage(Y, X) = 0 Then
  2567.               SingleRectangle(0).X = Rectangle(3, 0).X
  2568.               SingleRectangle(0).Y = Rectangle(3, 0).Y
  2569.               SingleRectangle(1).X = Rectangle(3, 1).X
  2570.               SingleRectangle(1).Y = Rectangle(3, 1).Y
  2571.               SingleRectangle(2).X = Rectangle(3, 2).X
  2572.               SingleRectangle(2).Y = Rectangle(3, 2).Y
  2573.               SingleRectangle(3).X = Rectangle(3, 3).X
  2574.               SingleRectangle(3).Y = Rectangle(3, 3).Y
  2575.               Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleWEColor)
  2576.             End If
  2577.             For VertexNum = 0 To 3
  2578.               Rectangle(3, VertexNum).X = Rectangle(3, VertexNum).X + 1
  2579.             Next VertexNum
  2580.             X = X + 2
  2581.           Loop
  2582.           Y = Y + 1
  2583.         End If
  2584.         YOffset = YOffset + 1
  2585.       Else
  2586.         State = 5
  2587.       End If
  2588.       If UsePalette Then
  2589.         NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2590.       End If
  2591.       DoEvents
  2592.       If State < 5 Then
  2593.         Timer1.Enabled = True
  2594.       Else
  2595.         If State = 5 Then
  2596.           AlreadyPainting = False
  2597.           Call SqrDisplayUserMoves(MaxX, MaxY, UserPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2598.           If SolutionDisplayed Then
  2599.             Call SqrDisplaySolution(MaxY, ComputerPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2600.             Text1.Text = ""
  2601.           Else
  2602.             If UserHasSolved Then
  2603.               Text1.Text = "Congratulations!"
  2604.             Else
  2605.               Text1.Text = "Use the arrow keys to solve."
  2606.             End If
  2607.           End If
  2608.           mnuActionItem(1).Enabled = True
  2609.           mnuActionItem(2).Enabled = True
  2610.         End If
  2611.       End If
  2612.     Case Else
  2613.       DoEvents
  2614.   End Select
  2615. End Sub
  2616. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  2617.   If ((State = 5) And (Not SolutionDisplayed) And (Not UserHasSolved)) Then
  2618.     Dim DeltaIndex1 As Integer
  2619.     Dim OldPaletteHandle As Long
  2620.     Dim PassageFound As Integer
  2621.     Dim TemDouble As Double
  2622.     Dim XNext As Integer
  2623.     Dim XRelativeNext As Double
  2624.     Dim YNext As Integer
  2625.     Dim YRelativeNext As Double
  2626.     PassageFound = True
  2627.     DeltaIndex1 = -1
  2628.     If mnuStyleItem(0).Checked Then
  2629.       Select Case KeyCode
  2630.         Case vbKeyPageDown, vbKeyNumpad3
  2631.           DeltaIndex1 = 5
  2632.           KeyCode = 0
  2633.         Case vbKeyHome, vbKeyNumpad7
  2634.           DeltaIndex1 = 0
  2635.           KeyCode = 0
  2636.         Case vbKeyLeft, vbKeyNumpad4
  2637.           Beep
  2638.           KeyCode = 0
  2639.         Case vbKeyUp, vbKeyNumpad8
  2640.           DeltaIndex1 = 2
  2641.           KeyCode = 0
  2642.         Case vbKeyRight, vbKeyNumpad6
  2643.           Beep
  2644.           KeyCode = 0
  2645.         Case vbKeyDown, vbKeyNumpad2
  2646.           DeltaIndex1 = 3
  2647.           KeyCode = 0
  2648.         Case vbKeyPageUp, vbKeyNumpad9
  2649.           DeltaIndex1 = 4
  2650.           KeyCode = 0
  2651.         Case vbKeyEnd, vbKeyNumpad1
  2652.           DeltaIndex1 = 1
  2653.           KeyCode = 0
  2654.       End Select
  2655.       If DeltaIndex1 >= 0 Then
  2656.         XNext = UserX + HexDeltaX(DeltaIndex1, 0)
  2657.         If XNext <= 0 Then
  2658.           PassageFound = False
  2659.         Else
  2660.           If XNext >= MaxX Then
  2661.             PassageFound = False
  2662.           Else
  2663.             YNext = UserY + HexDeltaY(DeltaIndex1, 0)
  2664.             If YNext <= 0 Then
  2665.               PassageFound = False
  2666.             Else
  2667.               If YNext > MaxY Then
  2668.                 PassageFound = False
  2669.               Else
  2670.                 If UserPage(YNext, XNext) = 0 Then
  2671.                   PassageFound = False
  2672.                 End If
  2673.               End If
  2674.             End If
  2675.           End If
  2676.         End If
  2677.         If PassageFound Then
  2678.           XNext = XNext + HexDeltaX(DeltaIndex1, 0)
  2679.           YNext = YNext + HexDeltaY(DeltaIndex1, 0)
  2680.           If YNext < MaxY Then
  2681.             If UserPage(YNext, XNext) = 1 Then
  2682.               CurrentColor = BackoutColor
  2683.               UserPage(UserY, UserX) = 3
  2684.             Else
  2685.               CurrentColor = AdvanceColor
  2686.               UserPage(YNext, XNext) = 1
  2687.             End If
  2688.             Select Case (YNext - UserY)
  2689.               Case -4
  2690.                 XRelativeNext = UserXRelative
  2691.                 YRelativeNext = UserYRelative - Sqrt3
  2692.               Case -2
  2693.                 If XNext > UserX Then
  2694.                   XRelativeNext = UserXRelative + 3# / 2#
  2695.                   YRelativeNext = UserYRelative - Sqrt3 / 2#
  2696.                 Else
  2697.                   XRelativeNext = UserXRelative - 3# / 2#
  2698.                   YRelativeNext = UserYRelative - Sqrt3 / 2#
  2699.                 End If
  2700.               Case 2
  2701.                 If XNext > UserX Then
  2702.                   XRelativeNext = UserXRelative + 3# / 2#
  2703.                   YRelativeNext = UserYRelative + Sqrt3 / 2#
  2704.                 Else
  2705.                   XRelativeNext = UserXRelative - 3# / 2#
  2706.                   YRelativeNext = UserYRelative + Sqrt3 / 2#
  2707.                 End If
  2708.               Case Else
  2709.                 XRelativeNext = UserXRelative
  2710.                 YRelativeNext = UserYRelative + Sqrt3
  2711.             End Select
  2712.             If UsePalette Then
  2713.               OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2714.               NumRealized = RealizePalette(frm3DMaze.hDC)
  2715.             End If
  2716.             Call DrawLine(UserXRelative, UserYRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2717.             If UsePalette Then
  2718.               NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2719.             End If
  2720.           Else
  2721.             CurrentColor = AdvanceColor
  2722.             If UsePalette Then
  2723.               OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2724.               NumRealized = RealizePalette(frm3DMaze.hDC)
  2725.             End If
  2726.             Call DrawLine(UserXRelative, UserYRelative, UserXRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2727.             If UsePalette Then
  2728.               NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2729.             End If
  2730.             UserHasSolved = True
  2731.             Text1.Text = "Congratulations!"
  2732.           End If
  2733.           UserX = XNext
  2734.           UserY = YNext
  2735.           UserXRelative = XRelativeNext
  2736.           UserYRelative = YRelativeNext
  2737.         Else
  2738.           Beep
  2739.         End If
  2740.       End If
  2741.     Else
  2742.       Select Case KeyCode
  2743.         Case vbKeyPageDown, vbKeyNumpad3
  2744.           Beep
  2745.           KeyCode = 0
  2746.         Case vbKeyHome, vbKeyNumpad7
  2747.           Beep
  2748.           KeyCode = 0
  2749.         Case vbKeyLeft, vbKeyNumpad4
  2750.           DeltaIndex1 = 0
  2751.           KeyCode = 0
  2752.         Case vbKeyUp, vbKeyNumpad8
  2753.           DeltaIndex1 = 3
  2754.           KeyCode = 0
  2755.         Case vbKeyRight, vbKeyNumpad6
  2756.           DeltaIndex1 = 2
  2757.           KeyCode = 0
  2758.         Case vbKeyDown, vbKeyNumpad2
  2759.           DeltaIndex1 = 1
  2760.           KeyCode = 0
  2761.         Case vbKeyPageUp, vbKeyNumpad9
  2762.           Beep
  2763.           KeyCode = 0
  2764.         Case vbKeyEnd, vbKeyNumpad1
  2765.           Beep
  2766.           KeyCode = 0
  2767.       End Select
  2768.       If DeltaIndex1 >= 0 Then
  2769.         XNext = UserX + SqrDeltaX(DeltaIndex1, 0)
  2770.         If XNext <= 0 Then
  2771.           PassageFound = False
  2772.         Else
  2773.           If XNext >= MaxX Then
  2774.             PassageFound = False
  2775.           Else
  2776.             YNext = UserY + SqrDeltaY(DeltaIndex1, 0)
  2777.             If YNext <= 0 Then
  2778.               PassageFound = False
  2779.             Else
  2780.               If YNext > MaxY Then
  2781.                 PassageFound = False
  2782.               Else
  2783.                 If UserPage(YNext, XNext) = 0 Then
  2784.                   PassageFound = False
  2785.                 End If
  2786.               End If
  2787.             End If
  2788.           End If
  2789.         End If
  2790.         If PassageFound Then
  2791.           XNext = XNext + SqrDeltaX(DeltaIndex1, 0)
  2792.           YNext = YNext + SqrDeltaY(DeltaIndex1, 0)
  2793.           If YNext < MaxY Then
  2794.             If UserPage(YNext, XNext) = 1 Then
  2795.               CurrentColor = BackoutColor
  2796.               UserPage(UserY, UserX) = 3
  2797.             Else
  2798.               CurrentColor = AdvanceColor
  2799.               UserPage(YNext, XNext) = 1
  2800.             End If
  2801.             TemDouble = SqrDeltaX(DeltaIndex1, 0)
  2802.             XRelativeNext = UserXRelative + TemDouble
  2803.             TemDouble = SqrDeltaY(DeltaIndex1, 0)
  2804.             YRelativeNext = UserYRelative + TemDouble
  2805.             If UsePalette Then
  2806.               OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2807.               NumRealized = RealizePalette(frm3DMaze.hDC)
  2808.             End If
  2809.             Call DrawLine(UserXRelative, UserYRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2810.             If UsePalette Then
  2811.               NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2812.             End If
  2813.           Else
  2814.             CurrentColor = AdvanceColor
  2815.             If UsePalette Then
  2816.               OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2817.               NumRealized = RealizePalette(frm3DMaze.hDC)
  2818.             End If
  2819.             Call DrawLine(UserXRelative, UserYRelative, UserXRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2820.             If UsePalette Then
  2821.               NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2822.             End If
  2823.             UserHasSolved = True
  2824.             Text1.Text = "Congratulations!"
  2825.           End If
  2826.           UserX = XNext
  2827.           UserY = YNext
  2828.           UserXRelative = XRelativeNext
  2829.           UserYRelative = YRelativeNext
  2830.         Else
  2831.           Beep
  2832.         End If
  2833.       End If
  2834.     End If
  2835.   End If
  2836. End Sub
  2837. Private Sub Form_Load()
  2838.   Dim ColorNum As Integer
  2839.   Dim DeltaIndex1a As Byte
  2840.   Dim DeltaIndex1b As Byte
  2841.   Dim DeltaIndex1c As Byte
  2842.   Dim DeltaIndex1d As Byte
  2843.   Dim DeltaIndex1e As Byte
  2844.   Dim DeltaIndex1f As Byte
  2845.   Dim DeltaIndex2 As Integer
  2846.   Dim Height As Single
  2847.   Dim Left As Single
  2848.   Dim LogicalPalette As LOGPALETTE
  2849.   Dim NumBits As Long
  2850.   Dim NumColorsFree As Long
  2851.   Dim Tint As Integer
  2852.   Dim Top As Single
  2853.   Dim Width As Single
  2854.   RelativeHeightOfWall = GetSetting("3dmaze", "parms", "RelativeHeightOfWall", 2#)
  2855.   RelativeWidthOfWall = GetSetting("3dmaze", "parms", "RelativeWidthOfWall", 0.25)
  2856.   MinWallLengthInInches = GetSetting("3dmaze", "parms", "MinWallLengthInInches", 0.25)
  2857.   Style = GetSetting("3dmaze", "style", "Style", "S")
  2858.   ScrollValue = GetSetting("3dmaze", "tilt", "Tilt", 45)
  2859.   VScroll1.Value = ScrollValue
  2860.   If Style = "S" Then
  2861.     mnuStyleItem(0).Checked = False
  2862.     mnuStyleItem(1).Checked = True
  2863.   Else
  2864.     mnuStyleItem(0).Checked = True
  2865.     mnuStyleItem(1).Checked = False
  2866.   End If
  2867.   OldPaletteHandle = 0
  2868.   AlreadyPainting = False
  2869.   SolutionDisplayed = False
  2870.   UserHasSolved = False
  2871.   State = 0
  2872.   Top = GetSetting("3dmaze", "frm3DMaze", "Top", 1356)
  2873.   Left = GetSetting("3dmaze", "frm3DMaze", "Left", 1512)
  2874.   Height = GetSetting("3dmaze", "frm3DMaze", "Height", 5136)
  2875.   Width = GetSetting("3dmaze", "frm3DMaze", "Width", 6096)
  2876.   VisibleWindowState = GetSetting("3dmaze", "frm3DMaze", "WindowState", 0)
  2877.   WindowState = VisibleWindowState
  2878.   ScaleMode = 1
  2879.   If WindowState = 1 Then
  2880.     Minimized = True
  2881.   Else
  2882.     If WindowState = 0 Then
  2883.       frm3DMaze.Move Left, Top, Width, Height
  2884.     End If
  2885.     Minimized = False
  2886.   End If
  2887.   Resize = True
  2888.   SubstitutionHigh(0) = 4
  2889.   SubstitutionHigh(1) = 1
  2890.   SubstitutionHigh(2) = 2
  2891.   SubstitutionHigh(3) = 8
  2892.   SubstitutionHigh(4) = 8
  2893.   SubstitutionHigh(5) = 9
  2894.   SubstitutionHigh(6) = 9
  2895.   SubstitutionHigh(7) = 6
  2896.   SubstitutionHigh(8) = 5
  2897.   SubstitutionHigh(9) = 7
  2898.   SubstitutionHigh(10) = 2
  2899.   SubstitutionHigh(11) = 1
  2900.   SubstitutionHigh(12) = 2
  2901.   SubstitutionHigh(13) = 9
  2902.   SubstitutionHigh(14) = 8
  2903.   SubstitutionHigh(15) = 8
  2904.   SubstitutionHigh(16) = 6
  2905.   SubstitutionHigh(17) = 3
  2906.   SubstitutionHigh(18) = 5
  2907.   SubstitutionHigh(19) = 1
  2908.   SubstitutionHigh(20) = 9
  2909.   SubstitutionHigh(21) = 5
  2910.   SubstitutionHigh(22) = 4
  2911.   SubstitutionHigh(23) = 4
  2912.   SubstitutionHigh(24) = 9
  2913.   SubstitutionHigh(25) = 8
  2914.   SubstitutionHigh(26) = 6
  2915.   SubstitutionHigh(27) = 0
  2916.   SubstitutionHigh(28) = 8
  2917.   SubstitutionHigh(29) = 0
  2918.   SubstitutionHigh(30) = 6
  2919.   SubstitutionHigh(31) = 0
  2920.   SubstitutionHigh(32) = 2
  2921.   SubstitutionHigh(33) = 4
  2922.   SubstitutionHigh(34) = 1
  2923.   SubstitutionHigh(35) = 9
  2924.   SubstitutionHigh(36) = 2
  2925.   SubstitutionHigh(37) = 0
  2926.   SubstitutionHigh(38) = 7
  2927.   SubstitutionHigh(39) = 4
  2928.   SubstitutionHigh(40) = 7
  2929.   SubstitutionHigh(41) = 3
  2930.   SubstitutionHigh(42) = 0
  2931.   SubstitutionHigh(43) = 0
  2932.   SubstitutionHigh(44) = 2
  2933.   SubstitutionHigh(45) = 6
  2934.   SubstitutionHigh(46) = 8
  2935.   SubstitutionHigh(47) = 9
  2936.   SubstitutionHigh(48) = 4
  2937.   SubstitutionHigh(49) = 0
  2938.   SubstitutionHigh(50) = 8
  2939.   SubstitutionHigh(51) = 3
  2940.   SubstitutionHigh(52) = 2
  2941.   SubstitutionHigh(53) = 3
  2942.   SubstitutionHigh(54) = 2
  2943.   SubstitutionHigh(55) = 5
  2944.   SubstitutionHigh(56) = 2
  2945.   SubstitutionHigh(57) = 4
  2946.   SubstitutionHigh(58) = 6
  2947.   SubstitutionHigh(59) = 9
  2948.   SubstitutionHigh(60) = 7
  2949.   SubstitutionHigh(61) = 9
  2950.   SubstitutionHigh(62) = 1
  2951.   SubstitutionHigh(63) = 3
  2952.   SubstitutionHigh(64) = 5
  2953.   SubstitutionHigh(65) = 7
  2954.   SubstitutionHigh(66) = 1
  2955.   SubstitutionHigh(67) = 1
  2956.   SubstitutionHigh(68) = 4
  2957.   SubstitutionHigh(69) = 5
  2958.   SubstitutionHigh(70) = 8
  2959.   SubstitutionHigh(71) = 1
  2960.   SubstitutionHigh(72) = 6
  2961.   SubstitutionHigh(73) = 0
  2962.   SubstitutionHigh(74) = 5
  2963.   SubstitutionHigh(75) = 7
  2964.   SubstitutionHigh(76) = 8
  2965.   SubstitutionHigh(77) = 2
  2966.   SubstitutionHigh(78) = 3
  2967.   SubstitutionHigh(79) = 3
  2968.   SubstitutionHigh(80) = 7
  2969.   SubstitutionHigh(81) = 3
  2970.   SubstitutionHigh(82) = 5
  2971.   SubstitutionHigh(83) = 1
  2972.   SubstitutionHigh(84) = 7
  2973.   SubstitutionHigh(85) = 5
  2974.   SubstitutionHigh(86) = 4
  2975.   SubstitutionHigh(87) = 0
  2976.   SubstitutionHigh(88) = 3
  2977.   SubstitutionHigh(89) = 6
  2978.   SubstitutionHigh(90) = 3
  2979.   SubstitutionHigh(91) = 7
  2980.   SubstitutionHigh(92) = 7
  2981.   SubstitutionHigh(93) = 1
  2982.   SubstitutionHigh(94) = 9
  2983.   SubstitutionHigh(95) = 4
  2984.   SubstitutionHigh(96) = 0
  2985.   SubstitutionHigh(97) = 5
  2986.   SubstitutionHigh(98) = 6
  2987.   SubstitutionHigh(99) = 6
  2988.   SubstitutionLow(0) = 1
  2989.   SubstitutionLow(1) = 2
  2990.   SubstitutionLow(2) = 2
  2991.   SubstitutionLow(3) = 1
  2992.   SubstitutionLow(4) = 5
  2993.   SubstitutionLow(5) = 5
  2994.   SubstitutionLow(6) = 4
  2995.   SubstitutionLow(7) = 6
  2996.   SubstitutionLow(8) = 4
  2997.   SubstitutionLow(9) = 6
  2998.   SubstitutionLow(10) = 4
  2999.   SubstitutionLow(11) = 4
  3000.   SubstitutionLow(12) = 5
  3001.   SubstitutionLow(13) = 6
  3002.   SubstitutionLow(14) = 6
  3003.   SubstitutionLow(15) = 3
  3004.   SubstitutionLow(16) = 0
  3005.   SubstitutionLow(17) = 9
  3006.   SubstitutionLow(18) = 6
  3007.   SubstitutionLow(19) = 5
  3008.   SubstitutionLow(20) = 7
  3009.   SubstitutionLow(21) = 2
  3010.   SubstitutionLow(22) = 0
  3011.   SubstitutionLow(23) = 9
  3012.   SubstitutionLow(24) = 3
  3013.   SubstitutionLow(25) = 4
  3014.   SubstitutionLow(26) = 2
  3015.   SubstitutionLow(27) = 3
  3016.   SubstitutionLow(28) = 9
  3017.   SubstitutionLow(29) = 1
  3018.   SubstitutionLow(30) = 9
  3019.   SubstitutionLow(31) = 9
  3020.   SubstitutionLow(32) = 9
  3021.   SubstitutionLow(33) = 3
  3022.   SubstitutionLow(34) = 8
  3023.   SubstitutionLow(35) = 9
  3024.   SubstitutionLow(36) = 3
  3025.   SubstitutionLow(37) = 4
  3026.   SubstitutionLow(38) = 1
  3027.   SubstitutionLow(39) = 5
  3028.   SubstitutionLow(40) = 0
  3029.   SubstitutionLow(41) = 5
  3030.   SubstitutionLow(42) = 2
  3031.   SubstitutionLow(43) = 7
  3032.   SubstitutionLow(44) = 0
  3033.   SubstitutionLow(45) = 8
  3034.   SubstitutionLow(46) = 8
  3035.   SubstitutionLow(47) = 0
  3036.   SubstitutionLow(48) = 4
  3037.   SubstitutionLow(49) = 5
  3038.   SubstitutionLow(50) = 0
  3039.   SubstitutionLow(51) = 3
  3040.   SubstitutionLow(52) = 6
  3041.   SubstitutionLow(53) = 8
  3042.   SubstitutionLow(54) = 1
  3043.   SubstitutionLow(55) = 7
  3044.   SubstitutionLow(56) = 8
  3045.   SubstitutionLow(57) = 8
  3046.   SubstitutionLow(58) = 7
  3047.   SubstitutionLow(59) = 1
  3048.   SubstitutionLow(60) = 3
  3049.   SubstitutionLow(61) = 2
  3050.   SubstitutionLow(62) = 7
  3051.   SubstitutionLow(63) = 7
  3052.   SubstitutionLow(64) = 1
  3053.   SubstitutionLow(65) = 8
  3054.   SubstitutionLow(66) = 0
  3055.   SubstitutionLow(67) = 3
  3056.   SubstitutionLow(68) = 7
  3057.   SubstitutionLow(69) = 5
  3058.   SubstitutionLow(70) = 2
  3059.   SubstitutionLow(71) = 6
  3060.   SubstitutionLow(72) = 4
  3061.   SubstitutionLow(73) = 0
  3062.   SubstitutionLow(74) = 9
  3063.   SubstitutionLow(75) = 9
  3064.   SubstitutionLow(76) = 7
  3065.   SubstitutionLow(77) = 7
  3066.   SubstitutionLow(78) = 4
  3067.   SubstitutionLow(79) = 6
  3068.   SubstitutionLow(80) = 2
  3069.   SubstitutionLow(81) = 0
  3070.   SubstitutionLow(82) = 0
  3071.   SubstitutionLow(83) = 1
  3072.   SubstitutionLow(84) = 7
  3073.   SubstitutionLow(85) = 3
  3074.   SubstitutionLow(86) = 6
  3075.   SubstitutionLow(87) = 6
  3076.   SubstitutionLow(88) = 1
  3077.   SubstitutionLow(89) = 1
  3078.   SubstitutionLow(90) = 2
  3079.   SubstitutionLow(91) = 4
  3080.   SubstitutionLow(92) = 5
  3081.   SubstitutionLow(93) = 9
  3082.   SubstitutionLow(94) = 8
  3083.   SubstitutionLow(95) = 2
  3084.   SubstitutionLow(96) = 8
  3085.   SubstitutionLow(97) = 8
  3086.   SubstitutionLow(98) = 3
  3087.   SubstitutionLow(99) = 5
  3088.   NumColorsFree = 1
  3089.   NumBits = GetDeviceCaps(frm3DMaze.hDC, PLANES) * GetDeviceCaps(frm3DMaze.hDC, BITSPIXEL)
  3090.   If NumBits >= 31 Then
  3091.     UsePalette = False
  3092.   Else
  3093.     Do While (NumBits > 0)
  3094.       NumColorsFree = 2 * NumColorsFree
  3095.       NumBits = NumBits - 1
  3096.     Loop
  3097.     NumColorsFree = NumColorsFree - GetDeviceCaps(frm3DMaze.hDC, COLORS)
  3098.     If NumColorsFree < 16 Then
  3099.       UsePalette = False
  3100.     Else
  3101.       UsePalette = True
  3102.     End If
  3103.   End If
  3104.   LogicalPalette.palVersion = 3 * 256
  3105.   LogicalPalette.palNumEntries = 16
  3106.   For ColorNum = 0 To NumColors - 4
  3107.     ' evenly spaced shades of gray
  3108.     Tint = (256 * ColorNum) \ (NumColors - 3)
  3109.     LogicalPalette.palPalEntry(ColorNum).peRed = Tint
  3110.     LogicalPalette.palPalEntry(ColorNum).peGreen = Tint
  3111.     LogicalPalette.palPalEntry(ColorNum).peBlue = Tint
  3112.     LogicalPalette.palPalEntry(ColorNum).peFlags = PC_NOCOLLAPSE
  3113.     RedGreenBlue(ColorNum) = RGB(Tint, Tint, Tint)
  3114.   Next ColorNum
  3115.   LogicalPalette.palPalEntry(BackoutColor).peRed = 255
  3116.   LogicalPalette.palPalEntry(BackoutColor).peGreen = 255
  3117.   LogicalPalette.palPalEntry(BackoutColor).peBlue = 0
  3118.   LogicalPalette.palPalEntry(BackoutColor).peFlags = PC_NOCOLLAPSE
  3119.   RedGreenBlue(BackoutColor) = RGB(255, 255, 0)
  3120.   LogicalPalette.palPalEntry(AdvanceColor).peRed = 0
  3121.   LogicalPalette.palPalEntry(AdvanceColor).peGreen = 255
  3122.   LogicalPalette.palPalEntry(AdvanceColor).peBlue = 0
  3123.   LogicalPalette.palPalEntry(AdvanceColor).peFlags = PC_NOCOLLAPSE
  3124.   RedGreenBlue(AdvanceColor) = RGB(0, 255, 0)
  3125.   LogicalPalette.palPalEntry(SolutionColor).peRed = 255
  3126.   LogicalPalette.palPalEntry(SolutionColor).peGreen = 0
  3127.   LogicalPalette.palPalEntry(SolutionColor).peBlue = 0
  3128.   LogicalPalette.palPalEntry(SolutionColor).peFlags = PC_NOCOLLAPSE
  3129.   RedGreenBlue(SolutionColor) = RGB(255, 0, 0)
  3130.   If UsePalette Then
  3131.     PaletteHandle = CreatePalette(LogicalPalette)
  3132.   End If
  3133.   HexDeltaY(0, 0) = -1
  3134.   HexDeltaX(0, 0) = -2
  3135.   HexDeltaY(1, 0) = 1
  3136.   HexDeltaX(1, 0) = -2
  3137.   HexDeltaY(2, 0) = -2
  3138.   HexDeltaX(2, 0) = 0
  3139.   HexDeltaY(3, 0) = 2
  3140.   HexDeltaX(3, 0) = 0
  3141.   HexDeltaY(4, 0) = -1
  3142.   HexDeltaX(4, 0) = 2
  3143.   HexDeltaY(5, 0) = 1
  3144.   HexDeltaX(5, 0) = 2
  3145.   DeltaIndex2 = 0
  3146.   For DeltaIndex1a = 0 To 5
  3147.     For DeltaIndex1b = 0 To 5
  3148.       If DeltaIndex1a <> DeltaIndex1b Then
  3149.         For DeltaIndex1c = 0 To 5
  3150.           If (DeltaIndex1a <> DeltaIndex1c) And (DeltaIndex1b <> DeltaIndex1c) Then
  3151.             For DeltaIndex1d = 0 To 5
  3152.               If (DeltaIndex1a <> DeltaIndex1d) And (DeltaIndex1b <> DeltaIndex1d) And (DeltaIndex1c <> DeltaIndex1d) Then
  3153.                 For DeltaIndex1e = 0 To 5
  3154.                   If (DeltaIndex1a <> DeltaIndex1e) And (DeltaIndex1b <> DeltaIndex1e) And (DeltaIndex1c <> DeltaIndex1e) And (DeltaIndex1d <> DeltaIndex1e) Then
  3155.                     For DeltaIndex1f = 0 To 5
  3156.                       If (DeltaIndex1a <> DeltaIndex1f) And (DeltaIndex1b <> DeltaIndex1f) And (DeltaIndex1c <> DeltaIndex1f) And (DeltaIndex1d <> DeltaIndex1f) And (DeltaIndex1e <> DeltaIndex1f) Then
  3157.                         HexDeltaX(DeltaIndex1a, DeltaIndex2) = HexDeltaX(0, 0)
  3158.                         HexDeltaY(DeltaIndex1a, DeltaIndex2) = HexDeltaY(0, 0)
  3159.                         HexDeltaX(DeltaIndex1b, DeltaIndex2) = HexDeltaX(1, 0)
  3160.                         HexDeltaY(DeltaIndex1b, DeltaIndex2) = HexDeltaY(1, 0)
  3161.                         HexDeltaX(DeltaIndex1c, DeltaIndex2) = HexDeltaX(2, 0)
  3162.                         HexDeltaY(DeltaIndex1c, DeltaIndex2) = HexDeltaY(2, 0)
  3163.                         HexDeltaX(DeltaIndex1d, DeltaIndex2) = HexDeltaX(3, 0)
  3164.                         HexDeltaY(DeltaIndex1d, DeltaIndex2) = HexDeltaY(3, 0)
  3165.                         HexDeltaX(DeltaIndex1e, DeltaIndex2) = HexDeltaX(4, 0)
  3166.                         HexDeltaY(DeltaIndex1e, DeltaIndex2) = HexDeltaY(4, 0)
  3167.                         HexDeltaX(DeltaIndex1f, DeltaIndex2) = HexDeltaX(5, 0)
  3168.                         HexDeltaY(DeltaIndex1f, DeltaIndex2) = HexDeltaY(5, 0)
  3169.                         DeltaIndex2 = DeltaIndex2 + 1
  3170.                       End If
  3171.                     Next DeltaIndex1f
  3172.                   End If
  3173.                 Next DeltaIndex1e
  3174.               End If
  3175.             Next DeltaIndex1d
  3176.           End If
  3177.         Next DeltaIndex1c
  3178.       End If
  3179.     Next DeltaIndex1b
  3180.   Next DeltaIndex1a
  3181.   SqrDeltaY(0, 0) = 0
  3182.   SqrDeltaX(0, 0) = -1
  3183.   SqrDeltaY(1, 0) = 1
  3184.   SqrDeltaX(1, 0) = 0
  3185.   SqrDeltaY(2, 0) = 0
  3186.   SqrDeltaX(2, 0) = 1
  3187.   SqrDeltaY(3, 0) = -1
  3188.   SqrDeltaX(3, 0) = 0
  3189.   DeltaIndex2 = 0
  3190.   For DeltaIndex1a = 0 To 3
  3191.     For DeltaIndex1b = 0 To 3
  3192.       If DeltaIndex1a <> DeltaIndex1b Then
  3193.         For DeltaIndex1c = 0 To 3
  3194.           If (DeltaIndex1a <> DeltaIndex1c) And (DeltaIndex1b <> DeltaIndex1c) Then
  3195.             For DeltaIndex1d = 0 To 3
  3196.               If (DeltaIndex1a <> DeltaIndex1d) And (DeltaIndex1b <> DeltaIndex1d) And (DeltaIndex1c <> DeltaIndex1d) Then
  3197.                 SqrDeltaX(DeltaIndex1a, DeltaIndex2) = SqrDeltaX(0, 0)
  3198.                 SqrDeltaY(DeltaIndex1a, DeltaIndex2) = SqrDeltaY(0, 0)
  3199.                 SqrDeltaX(DeltaIndex1b, DeltaIndex2) = SqrDeltaX(1, 0)
  3200.                 SqrDeltaY(DeltaIndex1b, DeltaIndex2) = SqrDeltaY(1, 0)
  3201.                 SqrDeltaX(DeltaIndex1c, DeltaIndex2) = SqrDeltaX(2, 0)
  3202.                 SqrDeltaY(DeltaIndex1c, DeltaIndex2) = SqrDeltaY(2, 0)
  3203.                 SqrDeltaX(DeltaIndex1d, DeltaIndex2) = SqrDeltaX(3, 0)
  3204.                 SqrDeltaY(DeltaIndex1d, DeltaIndex2) = SqrDeltaY(3, 0)
  3205.                 DeltaIndex2 = DeltaIndex2 + 1
  3206.               End If
  3207.             Next DeltaIndex1d
  3208.           End If
  3209.         Next DeltaIndex1c
  3210.       End If
  3211.     Next DeltaIndex1b
  3212.   Next DeltaIndex1a
  3213.   Sqrt3 = Sqr(3#)
  3214. End Sub
  3215. Private Sub Form_Paint()
  3216.   mnuActionItem(1).Enabled = False
  3217.   mnuActionItem(2).Enabled = False
  3218.   Paint = True
  3219.   State = 0
  3220.   If Not AlreadyPainting Then
  3221.     AlreadyPainting = True
  3222.     Timer1.Enabled = True
  3223.   End If
  3224. End Sub
  3225. Private Sub Form_Resize()
  3226.   If State <> 6 Then
  3227.     If WindowState = 1 Then
  3228.       Minimized = True
  3229.       Cls
  3230.       State = 5
  3231.       AlreadyPainting = False
  3232.     Else
  3233.       VisibleWindowState = WindowState
  3234.       If ScaleHeight < 3 * Text1.Height Then
  3235.         Minimized = False
  3236.         Cls
  3237.         State = 5
  3238.         AlreadyPainting = False
  3239.         Text1.Text = "This window is too small!"
  3240.       Else
  3241.         VScroll1.Height = ScaleHeight - Text1.Height
  3242.         VScroll1.Left = ScaleWidth - VScroll1.Width
  3243.         Text1.Top = ScaleHeight - Text1.Height
  3244.         Text1.Width = ScaleWidth
  3245.         Paint = True
  3246.         State = 0
  3247.         If (Not Minimized) Then
  3248.           Resize = True
  3249.           UserHasSolved = False
  3250.           SolutionDisplayed = False
  3251.           Seed = Str(Timer)
  3252.         End If
  3253.         Minimized = False
  3254.         Refresh
  3255.       End If
  3256.     End If
  3257.   End If
  3258. End Sub
  3259. Private Sub Form_Unload(Cancel As Integer)
  3260.   State = 6
  3261.   Timer1.Enabled = False
  3262.   SaveSetting "3dmaze", "parms", "MinWallLengthInInches", frm3DMaze.MinWallLengthInInches
  3263.   SaveSetting "3dmaze", "parms", "RelativeWidthOfWall", frm3DMaze.RelativeWidthOfWall
  3264.   SaveSetting "3dmaze", "parms", "RelativeHeightOfWall", frm3DMaze.RelativeHeightOfWall
  3265.   SaveSetting "3dmaze", "style", "Style", Style
  3266.   SaveSetting "3dmaze", "tilt", "Tilt", ScrollValue
  3267.   SaveSetting "3dmaze", "frm3DMaze", "WindowState", VisibleWindowState
  3268.   WindowState = 0
  3269.   ScaleMode = 1
  3270.   SaveSetting "3dmaze", "frm3DMaze", "Top", frm3DMaze.Top
  3271.   SaveSetting "3dmaze", "frm3DMaze", "Left", frm3DMaze.Left
  3272.   SaveSetting "3dmaze", "frm3DMaze", "Height", frm3DMaze.Height
  3273.   SaveSetting "3dmaze", "frm3DMaze", "Width", frm3DMaze.Width
  3274.   Erase Stack
  3275.   Erase UserPage
  3276.   Erase ComputerPage
  3277. End Sub
  3278. Private Sub mnuActionItem_Click(Index As Integer)
  3279.   Select Case Index
  3280.     Case 0
  3281.       SolutionDisplayed = False
  3282.       Call Form_Resize
  3283.     Case 1
  3284.       SolutionDisplayed = True
  3285.       Text1.Text = ""
  3286.       If mnuStyleItem(0).Checked Then
  3287.         Call HexDisplaySolution(MaxY, ComputerPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  3288.       Else
  3289.         Call SqrDisplaySolution(MaxY, ComputerPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  3290.       End If
  3291.     Case 2
  3292.       UserHasSolved = False
  3293.       SolutionDisplayed = False
  3294.       Paint = True
  3295.       State = 0
  3296.       For UserX = 0 To MaxX
  3297.         For UserY = 0 To MaxY
  3298.           If ComputerPage(UserY, UserX) = 0 Then
  3299.             UserPage(UserY, UserX) = 0
  3300.           Else
  3301.             UserPage(UserY, UserX) = 2
  3302.           End If
  3303.         Next UserY
  3304.       Next UserX
  3305.       If mnuStyleItem(0).Checked Then
  3306.         UserX = 3
  3307.         UserXRelative = 1#
  3308.         UserY = 2
  3309.         UserYRelative = Sqrt3 / 2#
  3310.       Else
  3311.         UserX = 1
  3312.         UserXRelative = (RelativeWidthOfWall + 1#) / 2#
  3313.         UserY = 1
  3314.         UserYRelative = (RelativeWidthOfWall + 1#) / 2#
  3315.       End If
  3316.       UserPage(UserY, UserX) = 1
  3317.       Refresh
  3318.     Case 4
  3319.       State = 6
  3320.       Timer1.Enabled = False
  3321.       SaveSetting "3dmaze", "parms", "MinWallLengthInInches", frm3DMaze.MinWallLengthInInches
  3322.       SaveSetting "3dmaze", "parms", "RelativeWidthOfWall", frm3DMaze.RelativeWidthOfWall
  3323.       SaveSetting "3dmaze", "parms", "RelativeHeightOfWall", frm3DMaze.RelativeHeightOfWall
  3324.       SaveSetting "3dmaze", "style", "Style", Style
  3325.       SaveSetting "3dmaze", "tilt", "Tilt", ScrollValue
  3326.       SaveSetting "3dmaze", "frm3DMaze", "WindowState", VisibleWindowState
  3327.       ScaleMode = 1
  3328.       WindowState = 0
  3329.       SaveSetting "3dmaze", "frm3DMaze", "Top", frm3DMaze.Top
  3330.       SaveSetting "3dmaze", "frm3DMaze", "Left", frm3DMaze.Left
  3331.       SaveSetting "3dmaze", "frm3DMaze", "Height", frm3DMaze.Height
  3332.       SaveSetting "3dmaze", "frm3DMaze", "Width", frm3DMaze.Width
  3333.       Erase Stack
  3334.       Erase UserPage
  3335.       Erase ComputerPage
  3336.       End
  3337.     Case Else
  3338.   End Select
  3339. End Sub
  3340. Private Sub mnuHelpItem_Click(Index As Integer)
  3341.   Dim rc As Integer
  3342.   rc = MsgBox("3DMaze" + Chr(13) + Chr(13) + "Copyright " + Chr(169) + " 1995, 1996 James L. Dean (csvcjld@nomvs.lsumc.edu)" + Chr(13) + Chr(13) + "This application may be distributed without payment to James L. Dean." + Chr(13) + Chr(13) + "As per Microsoft's license for Visual Basic 4.0, the end-user may not distribute the components having names starting with other than " _
  3343. + Chr(34) + "3dmaze" + Chr(34) + "," + Chr(34) + "file_id" + Chr(34) + ", or " + Chr(34) + "parm" + Chr(34) + ".", vbOKOnly, "About 3DMaze")
  3344. End Sub
  3345. Private Sub mnuParameters_Click(Index As Integer)
  3346.   frmParms.Show 1
  3347. End Sub
  3348. Private Sub mnuStyleItem_Click(Index As Integer)
  3349.   Select Case Index
  3350.     Case 0
  3351.       If mnuStyleItem(1).Checked Then
  3352.         mnuStyleItem(0).Checked = True
  3353.         mnuStyleItem(1).Checked = False
  3354.         Style = "H"
  3355.         SolutionDisplayed = False
  3356.         Call Form_Resize
  3357.       End If
  3358.     Case 1
  3359.       If mnuStyleItem(0).Checked Then
  3360.         mnuStyleItem(0).Checked = False
  3361.         mnuStyleItem(1).Checked = True
  3362.         Style = "S"
  3363.         SolutionDisplayed = False
  3364.         Call Form_Resize
  3365.       End If
  3366.   End Select
  3367. End Sub
  3368. Private Sub Timer1_Timer()
  3369.   Timer1.Enabled = False
  3370.   If mnuStyleItem(0).Checked Then
  3371.     Call HexOutputMaze
  3372.   Else
  3373.     Call SqrOutputMaze
  3374.   End If
  3375. End Sub
  3376. Private Sub VScroll1_Change()
  3377.   ScrollValue = VScroll1.Value
  3378.   Tilt = 90 - ScrollValue
  3379.   Paint = True
  3380.   State = 0
  3381.   If Not AlreadyPainting Then Call Form_Paint
  3382. End Sub
  3383. Private Sub VScroll1_Scroll()
  3384.   If AlreadyPainting Then
  3385.     ScrollValue = VScroll1.Value
  3386.     Tilt = 90 - ScrollValue
  3387.     Paint = True
  3388.     State = 0
  3389.   End If
  3390. End Sub
  3391.